首页 > 编程语言 >java-线程之间的协作

java-线程之间的协作

时间:2023-03-20 14:23:35浏览次数:34  
标签:java void 协作 线程 m1 executorService public wait

 

 

一、线程之间的协作:join()

class JoinExample{

    private class A extends Thread{
        @Override
        public void run(){
            System.out.println("A");
        }
    }

    private class B extends Thread{
        private A a;

        B(A a){
            this.a = a;
        }

        @Override
        public void run(){
            try {
                // 在B线程中调用了A的join()方法,b会等待a线程结束才继续执行
                a.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("B");
        }
    }

    public void m1(){
        A a = new A();
        B b = new B(a);
        b.start();
        a.start();
    }

    public static void main(String[] args) {
        JoinExample joinExample = new JoinExample();
        joinExample.m1();
    }

}

>>>输出:

A

B

 

二、线程之间的协作:wait()、notify()、notifyAll()

/**
* 线程之间的协作:wait()、notify()、notifyAll(),它们都属于Object的一部分,不属于Thread。只能在同步方法/块中使用
* wait()和sleep()的区别:wait()是Object的方法,sleep()是Thread的静态方法。wait()会释放锁,sleep()不会释放锁
*/
class WaitNotifyExample{

    public synchronized void m1(){
        System.out.println("m1 output");
        notify();
    }

    public synchronized void m2(){
        try {
            // 使用wait(),线程在等待时被挂起,直到其他线程调用notify()或notifyAll()后才会唤醒挂起的线程
            // wait()挂起期间,线程会释放锁。因为如果未释放锁其他线程就无法进入对象的同步方法/块中,就无法执行notify()来唤醒挂起的线程,造成死锁
            wait();
            System.out.println("m2 output");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        WaitNotifyExample waitNotifyExample = new WaitNotifyExample();
        executorService.execute(waitNotifyExample::m2);
        executorService.execute(waitNotifyExample::m1);

        executorService.shutdown();

    }

}

>>>输出:

m1 output
m2 output

三、线程之间的协作:await()、signal()、signalAll(),属于J.U.C的Condition类。相比于wait(),await()可以指定等待的条件

class AwaitSignalExample{
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();

    public void m1(){
        lock.lock();
        try {
            System.out.println("before");
            condition.signal();
        } finally {
            lock.unlock();
        }
    }

    public void m2(){
        lock.lock();
        try {
            // 在Condition上使用await()使线程等待,其他线程调用signal()或signalAll()唤醒等待的线程
            condition.await();
            System.out.println("after");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        AwaitSignalExample awaitSignalExample = new AwaitSignalExample();
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(awaitSignalExample::m2);
        executorService.execute(awaitSignalExample::m1);

        executorService.shutdown();
    }

}

>>>输出:

before

after

 

标签:java,void,协作,线程,m1,executorService,public,wait
From: https://www.cnblogs.com/jinziguang/p/17236123.html

相关文章

  • java 根据word xml模板生成word(个人v2版本)
    这里用的是poi相关jar包以及freemarker插值技术实现,poi相关jar包这里不再述说1,编辑word并保存为xml其中需要动态输出的内容使用${xxx}代替,xxx是你的java类属性值,如:年龄:${age......
  • 尚硅谷_宋红康_第10章_多线程
    第10章_多线程讲师:尚硅谷-宋红康(江湖人称:康师傅)官网:http://www.atguigu.com本章专题与脉络我们之前学习的程序在没有跳转语句的情况下,都是由上至下沿着一条路径依......
  • Java线程知识点总结
    文章目录​​Java线程基础​​​​线程简介​​​​什么是进程​​​​什么是线程​​​​进程和线程的区别​​​​创建线程​​​​Thread​​​​Runnable​​​​Calla......
  • Java开发 - 消息队列之Kafka初体验
    目录​​前言​​​​Kafka​​​​什么是Kafka​​​​Kafka软件结构​​​​Kafka的特点​​​​怎么启动Kafka​​​​下载Kafka​​​​配置Kafka ​​​​Zookeeper​......
  • JavaScript解析JSON
    一个对象以“{”开始,“}”结束。每个“key”后跟一“:”,“‘key/value’对”之间运用“,”分隔。遍历JSON对象中的数据,可通过for-in循环实现。数据{"主题":{......
  • JavaScript加密/解密与OpenAI的对接:生成加密对话的ChatGPT 4.0应用
    首先,我们来看一个简单的JavaScript加密算法的示例,该算法将输入的字符串每个字符的ASCII值加上1,并返回一个新的字符串。以下是加密函数的代码:javascriptCopycodefunctionen......
  • java-线程互斥同步
    写在前边,/***线程互斥同步:通过两种锁机制来控制多个线程对共享资源的互斥访问,synchronized、ReentrantLock*/一、JVM实现的synchronized。使用synchronized不用担心没......
  • java-线程的使用方式
    前言,三种使用线程的方法:实现Runnable接口、实现Callable接口、继承Thread类。实现接口会更好,因为继承了Thread类就无法继承其他类,但可以实现多个接口/***线程状态:new、r......
  • Java 中如何优化大量的 if...else...
    策略模式(StrategyPattern)将每个条件分支的实现作为一个独立的策略类,然后使用一个上下文对象来选择要执行的策略。这种方法可以将大量的ifelse语句转换为对象之间的交互......
  • Java访问权限修饰符(public , private , protected)
    访问权限修饰符包括:public、protected、private和默认修饰符(friendly/包访问权限)。可以修饰在类、字段、方法前面。public:公开权限,所有类都可以访问。protected:继承访......