线程随笔记

线程创建方式

  1、继承Thread类,主线程中 new 实现类().start();线程名可以在子类构造方法中添加;

1 class Demo extends Thread {
2    Demo(String name){
3       super(name);    
4    }  
5   public void run(){
6       ...  
7   }
8 }

       2、实现Runnable接口,主线程中  new Thread (实现类对象,线程名).start()。

线程的状态

  新生状态   线程对象创建好了,未调用 start 方法之前。就是 new Thread() 

  就绪状态           线程在调用 start 方法之后,进入就绪状态(可运行状态)

  运行状态      线程获得线程调度器的调度之后进入运行状态,CPU执行

  阻塞状态      线程运行是调用了  join/sleep/wait  方法,进入阻塞状态

  死亡状态         线程执行结束

线程同步

  synchronized代码块、synchronized方法、lock

  同步代码块中可以使用任意锁。

  同步方法中不指定锁,当不是静态方法时,锁是 this  ; 当是静态方法时 ,锁是 类的字节文件  class ,可以用 getClass() 获取,也可以用当前 类名.class() 

  

  lock 接口 :将同步的隐式锁操作变成显式锁操作;condition 接口 :将 wait , notify , notifyAll 方法进行封装,变成监视器对象,可以任意锁组合

  Lock lock = new ReentrantLock();

  Condition con = lock.newCondition();

  lock.lock()   获取锁

  lock.unlock()  释放锁,通常定义在 finally 代码块中

  con.await()   等待,相当于wait();

  con.signal()    相当于 notify

  con.signalAll()   相当于 notifyAll.

 

wait 与 sleep

  wait 进入等待,可以指定时间也可以不指定时间,会释放锁

  sleep 进入睡眠,必须指定时间,不会释放锁

生产者与消费者

  1 import java.util.concurrent.locks.Condition;
  2 import java.util.concurrent.locks.Lock;
  3 import java.util.concurrent.locks.ReentrantLock;
  4 
  5 public class ProducterConsumer {
  6 
  7     public static void main(String[] args) {
  8         Resource r = new Resource();
  9         Produter p1 = new Produter(r);
 10         Produter p2 = new Produter(r);
 11         Cousumer c1 = new Cousumer(r);
 12         Cousumer c2 = new Cousumer(r);
 13         Thread t1 = new Thread(p1);
 14         Thread t2 = new Thread(p2);
 15         Thread t3 = new Thread(c1);
 16         Thread t4 = new Thread(c2);
 17         t1.start();
 18         t2.start();
 19         t3.start();
 20         t4.start();
 21     }
 22 
 23 }
 24 
 25 class Resource {
 26     private String name;
 27     private int count = 0;
 28     private boolean flag = false;
 29     Lock lock = new ReentrantLock();
 30     
 31     Condition prod_con = lock.newCondition();
 32     Condition cons_con = lock.newCondition();
 33     
 34     
 35     public void production(String name) {
 36         lock.lock();
 37         try {
 38             while(flag) {
 39                 prod_con.await();    //进入等待,释放锁
 40             }
 41             this.name = name + (++count);
 42             System.out.println(Thread.currentThread().getName() + "..生产了.." + this.name);
 43             flag = true;
 44             cons_con.signal();      //生产完毕,唤醒其他线程
 45         } catch (InterruptedException e) {
 46             e.printStackTrace();
 47         } finally {
 48             lock.unlock();
 49         }
 50     }
 51     
 52     public void consumption() {
 53         lock.lock();
 54         try {
 55             while(!flag) {
 56                 cons_con.await();    //进入等待,释放锁
 57             }
 58             System.out.println(Thread.currentThread().getName() + ".....消费了....." + this.name);
 59             flag = false;
 60             prod_con.signal();      //唤醒其他线程
 61         } catch (InterruptedException e) {
 62             e.printStackTrace();
 63         } finally {
 64             lock.unlock();
 65         }
 66     }
 67     
 68 }
 69 
 70 class Produter implements Runnable{
 71 
 72     private Resource r;
 73     
 74     Produter(Resource r){
 75         this.r = r;
 76     }
 77     
 78     @Override
 79     public void run() {
 80         while(true)
 81             r.production("粉蒸肉");
 82     }
 83     
 84 }
 85 
 86 class Cousumer implements Runnable{
 87 
 88     private Resource r;
 89     
 90     Cousumer(Resource r){
 91         this.r = r;
 92     }
 93     
 94     @Override
 95     public void run() {
 96         while(true)
 97             r.consumption();
 98     }
 99     
100 }

如有错误的地方,请指出。谢谢评论。

原文地址:https://www.cnblogs.com/mmling/p/8484032.html