本文主要是介绍[java][高级]Java线程间通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
/*
线程间的通信
多个线程在处理同一个资源,但是任务却不相同
*/class Resource {private String name;private String sex;private boolean flag = false;public synchronized void set(String name, String sex) {if (flag) try {this.wait();} catch (InterruptedException e) {}this.name = name;this.sex = sex;flag = true;this.notify();}public synchronized void out() {if (!flag) try {this.wait();} catch (InterruptedException e) {}System.out.println(name + "````````" + sex);flag = false;this.notify();}
}class Input implements Runnable {Object obj = new Object();Resource r;Input(Resource r) {this.r = r;}public void run() {int x = 0;while (true) {if (x == 0) {r.set("mike", "nan");} else {r.set("丽丽", "女女女女");}x = (x + 1) % 2;}}
}class Output implements Runnable {Resource r;Output(Resource r) {this.r = r;}public void run() {while (true) {r.out();}}
}class ResourceDemo {public static void main(String[] args) {Resource r = new Resource();Input in = new Input(r);Output out = new Output(r);Thread t1 = new Thread(in);Thread t2 = new Thread(out);t1.start();t2.start();}
}
这段代码是一个简单的Java程序,它演示了线程间的通信。程序中定义了一个名为Resource的类,它包含了一些私有成员变量和一个同步方法set以及一个同步方法out。set方法用于设置资源的名称和性别,而out方法用于输出资源的信息。
Input类实现了Runnable接口,它代表一个输入线程,负责设置资源的值。Output类也实现了Runnable接口,它代表一个输出线程,负责打印资源的信息。
在ResourceDemo类的main方法中,创建了Resource对象和两个线程对象t1和t2。t1线程用于执行Input类的run方法,而t2线程用于执行Output类的run方法。这两个线程分别代表不同的任务,它们通过Resource对象进行通信。
程序的关键点在于wait和notify方法的使用。当set方法被调用时,如果flag为true,表示资源已经被占用,那么调用wait方法会使当前线程等待,直到其他线程调用notify方法。当out方法被调用时,如果flag为false,表示资源未被占用,那么调用wait方法也会使当前线程等待,直到其他线程调用notify方法。
flag变量用于标记资源是否被占用。当资源被设置后,flag被设置为true,并且调用notify方法唤醒等待的线程。当资源被输出后,flag被设置为false,并且调用notify方法唤醒等待的线程。
这个程序的目的是演示线程同步和通信的基本机制,但它在实际应用中可能存在一些问题,比如死锁和资源竞争。在实际开发中,需要根据具体情况设计更健壮的线程同步机制。
这篇关于[java][高级]Java线程间通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!