• 【Java】Java中线程的使用


    摘要:本文讲解了Java中线程的使用,包括线程概念、线程同步、等内容

    一、线程概念:
    • 有序严谨的指令集称为程序
    • 程序的同时多运行称为线程
    • 程序中不同的执行路径称为线程
    • 多线程编程简单、效率高、易于资源共享
    二、线程同步
    • 线程同步指的是在一段程序执行过程中,无论成功还是失败,其他线程都会等待该线程执行完毕,才会转入其他线程。这样可以保证程序的完整性和安全性。
    三、例子与说明
    //实现代码
    // 此程序用来练习使用线程!
    //Version:1.0
    //@Author:Yongchun_zha
    package cha06;
    //第一种方法创建线程
    class Xc extends Thread//创建线程所需要继承的类
    {
     public void run()//run方法是覆盖父类的一个方法
     {
      for(int i=0;i<20;i++)
      {
       System.out.println("子函数");
      }
     }
    }
    public class L6_1
    {
     public static void main(String[] args)
     {
      Xc xc=new Xc();
      xc.start();//创建一个线程
    //注:谁调用的start方法,他就会去自动调用run方法;
    // start会单开启一个线程,而不是直接调用,程序同时往下执行
      for(int i=0;i<20;i++)
      {
       System.out.println("主函数");
      }
     }
    }
    //第二种方法创建线程(推荐方法)
    class Xc2 implements Runnable//不继承类,而是直接实现接口
    {
     public void run()
     {
      for(int i=0;i<20;i++)
      {
       System.out.println("子函数");
      }
     }
    
    }
    public class L6_1
    {
     public static void main(String[] args)
     {
      Xc2 xc2=new Xc2();
    
      Thread a=new Thread(xc2);
      a.start();
    
      for(int i=0;i<20;i++)
      {
       System.out.println("主函数");
      }
     }
    
    }
    //此程序用来练习使用线程!
    //Version:1.0
    //@Author:Yongchun_zha
    package cha06;
    //第一种方法创建线程
    class Xc extends Thread//创建线程所需要继承的类
    {
     public void run()//run方法是覆盖父类的一个方法
     {
      for(int i=0;i<20;i++)
      {
       System.out.println("子函数");
      }
     }
    }
    //练习线程功能:设定线程名称
    class Xc3 extends Thread
    {
     public void run()
     {
      System.out.println(Thread.currentThread()+"is running");//显示当前线程名称
     }
    
    }
    public class L6_1
    {
     public static void main(String[] args)
     {
      Xc3 xc1=new Xc3();
      xc1.setName("线程一");
      xc1.start();
    
      Xc3 xc2=new Xc3();
      xc2.setName("线程二");
      xc2.start();
    
      Xc3 xc3=new Xc3();
      xc3.setName("线程三");
      xc3.start();
    
      System.out.println(Thread.currentThread()+"is running");
     }
    
    }
    //线程练习:设置线程优先级
    public class L6_1
    {
     public static void main(String[] args)
     {
      Thread a1=new Thread(new Xc41());
      Thread a2=new Thread(new Xc42());
      a1.setPriority(Thread.NORM_PRIORITY+5);//设置线程优先级,默认级别为5,最多为10
      a1.start();
      a2.start();
     }
    
    }
    class Xc41 implements Runnable//不继承类,而是直接实现接口
    {
     public void run()
     {
      for(int i=0;i<100;i++)
      {
       System.out.println("1线程"+i);
      }
     }
    
    }
    class Xc42 implements Runnable//不继承类,而是直接实现接口
    {
     public void run()
     {
      for(int i=0;i<100;i++)
      {
       System.out.println("第2个线程正在执行"+i);
      }
     }
    
    }
    //线程的睡眠
    //注意:用throws抛异常的时候,如果向主调处抛异常的方法是从父类继承的或者是从接口实现的,
    //那么,覆盖父类方法或实现接口方法时,如果父类方法中的原方法或接口中的原抽象方法没有抛异常,
    //则子类覆盖父类的方法或实现接口的方法也不能抛异常。
    //当出现这种情况时只能用try...catch方法
    public class L6_1
    {
     public static void main(String[] args)
     {
      Thread xc5=new Thread(new Xc5());
      xc5.start();
    
     }
    
    }
    class Xc5 implements Runnable//不继承类,而是直接实现接口
    {
     public void run()
     {
      for(int i=0;i<10;i++)
      {
       System.out.println(Thread.currentThread()+" "+i);
       try
       {
        Thread.sleep(1000);//睡眠1000毫秒
       }
       catch(Exception e)
       {
        System.out.println("执行有误!");
       }
    
      }
     }
    
    }
    //线程的让步与阻塞
    public class L6_1
    {
     public static void main(String[] args)
     {
      Thread xc61=new Thread(new Xc6());
      Thread xc62=new Thread(new Xc6());
      xc61.setName("线程一");
      xc62.setName("线程二");
      xc61.start();
      xc62.start();
      try
      {
       xc61.join();//线程的阻塞
       //注:阻塞时将当前线程暂停,直至调用jion函数的线程执行完毕程序才继续往下执行
      }
      catch(Exception e)
      {
    
      }
      for(int i=0;i<20;i++)
      {
       System.out.println("主线程"+i);
      }
    
     }
    
    }
    class Xc6 implements Runnable//不继承类,而是直接实现接口
    {
     public void run()
     {
      for(int i=1;i<10;i++)
      {
       System.out.println(Thread.currentThread().getName()+": "+i);
    
       try
       {
        if(i%5==0)
        {
         Thread.yield();//线程让步
        }
       }
       catch(Exception e)
       {
        System.out.println("执行有误!");
       }
    
    
      }
     }
    
    }
    //实例
    //此程序用来实现一个简易的卖票流程!
    //Version:1.0
    //@Author:Yongchun_zha
    
    package cha06;
    public class L6_2
    {
     public static void main(String[] args)
     {
      Thread xc1=new Thread(new Xc());
      Thread xc2=new Thread(new Xc());
    
      xc1.start();
      xc2.start();
     }
    }
    class Xc implements Runnable
    {
     public static int chepiao=100;//注:static的作用是使得两个线程共用一个变量,而非分别使用
     public static String aa=new String("1");
    
     public void run()
     {
       while(true)
          {
        synchronized (aa) //即可以修饰代码块也可以修饰函数,其作用是让其所管辖的内容作为整体执行,当该函数饰函数时,不需要字符串,相当于默认this。
        {
         if(chepiao>0)
               {
          System.out.println("第"+Thread.currentThread().getName()+"个车站正在卖第"+(101-chepiao)+"张");
                --chepiao;
               }
               else
               {
                break;
               }
               }
           }
     }
    }
    //此程序用来实现一个简易的生产消费流程!
    //Version:1.0
    //@Author:Yongchun_zha
    
    package cha06;
    public class L6_3
    {
     public static void main(String[] args)
     {
      Ck ck=new Ck();
      Shengchan sc=new Shengchan(ck);
      Xiaofei xf=new Xiaofei(ck);
    
      Thread xc1=new Thread(sc);
      xc1.start();
    
      Thread xc2=new Thread(xf);
      xc2.start();
    
     }
    }
    //仓库类
    class Ck
    {
     private char rl[]=new char[8];
     private int wp=0;
    
     public synchronized void shengchan(char aa)
     {
      while(wp==rl.length)
      {
       try
       {
        this.wait();
       }
       catch(Exception e){}
      }
    
        this.notify();//叫醒另一个进程,在当前进程就绪的前提下
    
      rl[wp]=aa;
      ++wp;
      System.out.println("生产线正在生产第 "+wp+" 个物品,该物品是: "+aa);
     }
    
        public synchronized void xiaofei()
        {
      char aa;
    
      while(wp==0)
      {
       try
       {
        this.wait();
       }
       catch(Exception e){}
      }
    
      this.notify();
    
      aa=rl[wp-1];
    
      System.out.println("消费线程正在消费第 "+wp+" 个产品,该产品是: "+aa);
      --wp;
     }
    
    }
    //生产类
    class Shengchan implements Runnable
    {
     private Ck ck=null;
    
     public Shengchan(Ck ck)
     {
      this.ck=ck;
     }
    
     public void run()
     {
      char aa;
    
      for(int i=0;i<26;i++)
      {
       aa=(char)('A'+i);
       ck.shengchan(aa);
      }
     }
    }
    //消费类
    class Xiaofei implements Runnable
    {
     private Ck ck=null;
    
     public Xiaofei(Ck ck)
     {
      this.ck=ck;
     }
    
     public void run()
     {
      for(int i=0;i<26;i++)
      {
       ck.xiaofei();
      }
     }
    
    }
  • 相关阅读:
    javascript页面刷新的几种方法
    Expo大作战(三十九)--expo sdk api之 DocumentPicker,Contacts(获取手机联系人信息),Branch
    Expo大作战(三十八)--expo sdk api之 FileSystem(文件操作系统)
    Expo大作战(三十七)--expo sdk api之 GLView,GestureHandler,Font,Fingerprint,DeviceMotion,Brightness
    Expo大作战(三十六)--expo sdk api之 ImagePicker,ImageManipulator,Camera
    Expo大作战(三十五)--expo sdk api之Location!
    一条SQL语句中算日销售额和月销售额
    绑定sql server数据库的用户与登录名
    牛腩代码生成器
    ASP.NET MVC做的微信WEBAPP中调用微信JSSDK扫一扫
  • 原文地址:https://www.cnblogs.com/yczha/p/13160276.html
Copyright © 2020-2023  润新知