线程间通信

线程之间如何通信?

1、设置一个标志变量,写一个死循环轮训该标志变量。(由于这种方式不推荐,这里不详细说明)

2、使用 等待/通知机制(wait/notify)来实现。(重点)

     这种方式实现需要使用到wait()、notify()、notifyAll()方法,它们都属于Object里的方法。

     wait()方法的作用:让当前执行代码的线程进入等待状态。该方法被调用后,当前线程会释放该对象所拥有的锁,停止剩余操作,当接到notify通知时,才继续执行后面的操作,否则一直处于等待状态

     notify()/notifyAll()方法的作用:通知那些等待获取该对象锁的线程,它们可以获取该对象锁了。该方法被调用后,并不会立刻就释放所拥有的锁,而是执行完剩余操作之后,才会释放锁

     以上几个方法在调用之前,必须获取该对象的对象级别锁,否则会报异常。即:只能在同步代码块或者同步方法里使用

小例子:要求共有两个线程,第一个线程输出“开始出发了...”和“已经到了火星...”这两句,第二个线程输出中间的语句,通过等待/通知机制实现如下效果?


参考代码如下:

package com.cjh;

/**
 * @author 陈嘉豪
 */
public class MyThread1 extends Thread{

    private String lock;
    public MyThread1(String lock){
        this.lock = lock;
    }

    @Override
    public void run() {
        synchronized(lock){
            System.out.println("开始出发了...");
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("已经到了火星...");
        }
    }
}
package com.cjh;

/**
 * @author 陈嘉豪
 */
public class MyThread2 extends Thread{

    private String lock;

    public MyThread2(String lock){
        this.lock = lock;
    }

    @Override
    public void run() {

        synchronized(lock){
            for(int i=1;i<=6;i++){
                System.out.println("走了"+i+"步");
                lock.notify();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
package com.cjh.test;

import com.cjh.MyThread1;
import com.cjh.MyThread2;

public class ThreadTest {
    public static void main(String[] args) throws InterruptedException {
        String lock = "lockObject";
        MyThread1 myThread1 = new MyThread1(lock);
        myThread1.start();

        MyThread2 myThread2 = new MyThread2(lock);
        myThread2.start();
    }
}
运行测试类,即可得到效果。到此你有没有对线程通信思想有个大概的了解了呢?O(∩_∩)O~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值