美文网首页
2020-06-28---线程通讯

2020-06-28---线程通讯

作者: 李霖神谷 | 来源:发表于2020-06-28 14:57 被阅读0次

1.等待唤醒机制

package com.shuai.domain;

//一个线程打印偶数一个线程打印奇数
public class Test {
    public int i=0;
    Object obj = new Object();

    public void jishu() {
        synchronized (obj) {
            while (i < 10) {
                if (i % 2 == 1) {
                    System.out.println("我运行的是奇数" + i);
                    i++;
                    obj.notify();
                } else {
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public void oushu() {
        synchronized (obj) {
            while (i < 10) {
                if (i % 2 == 0) {
                    System.out.println("我运行的是偶数" + i);
                    i++;
                    obj.notify();
                } else {
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        Test test = new Test();
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                test.jishu();
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                test.oushu();
            }
        });
        thread.start();
        thread2.start();
    }

}

2.一个线程等待所有其他线程执行完毕之后再执行

package com.shuai.domain;

import java.util.concurrent.CountDownLatch;

/**
 * 教练需要等待所有学生都准备完毕才能够开始训练
 */
public class Test {
//    设置一共有三个学生
    CountDownLatch countDownLatch=new CountDownLatch(3);
    public  void  read(){
        System.out.println("我是学生"+Thread.currentThread().getName()+"号");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"我准备好了");
//减一操作
        countDownLatch.countDown();

    }
    public  void coach(){
        System.out.println("等待学生准备");
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("开始训练吧");
    }
    public static void main(String[] args) {
        Test test = new Test();
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                test.read();
            }
        },"1");
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                test.read();
            }
        },"2");
        Thread thread3 = new Thread(new Runnable() {
            @Override
            public void run() {
                test.read();
            }
        },"3");
        Thread thread4 = new Thread(new Runnable() {
            @Override
            public void run() {
                test.coach();
            }
        });
        thread4.start();
        thread.start();
        thread2.start();
        thread3.start();
    }

}

3.一组线程准备完毕之后同时启动

package com.shuai.domain;

import java.util.Date;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;

/**
 * 所有学生准备好之后同时运行
 */
public class Test {
//    一共有四个线程
CyclicBarrier cyclicBarrier=new CyclicBarrier(4);
public  void read(){
    String name=Thread.currentThread().getName();
    System.out.println(name+"我在准备");
    try {
        cyclicBarrier.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (BrokenBarrierException e) {
        e.printStackTrace();
    }
    System.out.println(name+"启动完毕"+System.currentTimeMillis());
}
    public static void main(String[] args) {
        Test test = new Test();
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                test.read();
            }
        },"1");
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                test.read();
            }
        },"2");
        Thread thread3 = new Thread(new Runnable() {
            @Override
            public void run() {
                test.read();
            }
        },"3");
        Thread thread4 = new Thread(new Runnable() {
            @Override
            public void run() {
                test.read();
            }
        });
        thread4.start();
        thread.start();
        thread2.start();
        thread3.start();
    }

}

相关文章

  • 2020-06-28---线程通讯

    1.等待唤醒机制 2.一个线程等待所有其他线程执行完毕之后再执行 3.一组线程准备完毕之后同时启动

  • GCD线程通讯

    GCD线程通讯 NSThread线程通讯

  • 多线程

    创建线程: 比较: 线程同步: 线程的通讯:

  • 线程间通讯

    1.线程间通讯常用方法 2.线程间通讯的体现

  • 多线程(三)——多线程之间通讯

    什么是多线程之间通讯 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。 多线程之间通讯需求:...

  • 3.多线程之间通讯

    什么是多线程之间通讯? 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。 多线程之间通讯需求...

  • 线程通讯

    Object中的wait notify 1,在加锁的状态下完成通讯 2,并发情况,配合lock使用 Object&...

  • 线程通讯

    1、代码实现多线程模拟3个窗口卖票 资源类:票 多线程:窗口 总结:各个窗口卖票,互相之间不沟通,谁先抢到了归谁。...

  • iOS开发经验(19)-多线程

    目录 pthread NSThread GCD NSOperation 线程锁 线程通讯 | 多线程实现方案 ...

  • Java架构师面试题全集:Java基础+技术框架+系统架构+分布

    基础题目 Java线程的状态 进程和线程的区别,进程间如何通讯,线程间如何通讯 HashMap的数据结构是什么?如...

网友评论

      本文标题:2020-06-28---线程通讯

      本文链接:https://www.haomeiwen.com/subject/huzifktx.html