zoukankan      html  css  js  c++  java
  • 线程随笔记

    线程创建方式

      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 }

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

  • 相关阅读:
    CF899A Splitting in Teams
    CF898A Rounding
    CF914A Perfect Squares
    CF864A Fair Game
    CF909A Generate Login
    关于C++的一些函数的使用方法
    又是一个二模02,不过day2
    2模02day1题解
    二模Day2题解
    KMP算法心得
  • 原文地址:https://www.cnblogs.com/mmling/p/8484032.html
Copyright © 2011-2022 走看看