java多线程学习之创建线程与线程间通信

来源:互联网 发布:淘宝江南布衣假货 编辑:程序博客网 时间:2024/05/31 13:16

一.实现runable接口创建线程的步骤:

  1. 定义类实现runable接口,
  2. 覆盖接口中的run方法,并将线程的任务代码写进run方法中
  3. 通过Thread类创建线程对象,并将runable接口的子类对象作为Thread类的构造函数进行传递。
    4.调用线程对象的start方法开启线程。
class NewThread implements Runable{    public void run(){}}

二.此方法较继承Thread类来创建线程的好处:

  1. 不必继承Thread类中的所有方法
  2. 避免了java单继承的局限性。

三 线程同步:

  1. 使用synchronized代码块,锁是object
  2. 使用synchronized同步函数,锁是this
  3. 静态的同步函数使用的锁 是该函数所属的字节码文件对象,可以getclass()获取。

四 线程间通信

多个线程处理同一个共享资源,但是任务不同

等待/唤醒机制

  1. wait():Object类的方法,让线程处于冻结状态(进入等待对象锁队列),被wait的线程会被存储到线程池中,释放cpu,释放锁。
  2. sleep():Thread类的方法,释放cpu,但是不释放锁。
  3. notify():Object类的方法,唤醒线程池中的一个线程(任意)。

*这些方法必须写在同步中
*必须明确操作的是哪个锁上的县城

五 实例:生产者消费者问题

package socket.MultiThread;/** * Created by lenovo on 2017/3/14. */class Resource {    private String name;    int count;    boolean flag = false;    public synchronized void produce(String name) {        if (flag) {            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        this.name = name + count;        ++count;        System.out.println(Thread.currentThread().getName() + name+count + "+1");        flag = true;        notify();    }    public synchronized void consume() {        if (!flag) {            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        System.out.println(Thread.currentThread().getName() + name +count+ "-1");        flag = false;        notify();    }}class Producer implements Runnable {    Resource r;    public Producer(Resource r) {        this.r = r;    }    @Override    public void run() {        while (true) {            r.produce("烤鸭");        }    }}class Consumer implements Runnable {    Resource r;    public Consumer(Resource r) {        this.r = r;    }    @Override    public void run() {        while(true){            r.consume();        }    }}public class ProducerConsumer {    public static void main(String[] args) {        Resource r=new Resource();        Producer producer=new Producer(r);        Consumer consumer=new Consumer(r);        Thread t1=new Thread(producer);        Thread t2=new Thread(consumer);        t1.start();        t2.start();    }}
0 0