Java多线程之间通信——修改对象中的成员变量

  • Post author:
  • Post category:java


线程之间的通信,可通过对对象的成员变量的状态修改,达到控制线程的目的。

Java中,线程要基于对象才能创建。如:

ThreadTest t1 = new ThreadTest();

t1.start();//启动一个线程,并运行ThreadTest 中的run()方法

如何对另外一个线程的状态控制,通过传入另外那个对象的实例,然后调用另外这个对象的私有函数,该私有函数内改变成员变量的状态。

为什么是私有函数,是为了达到更好的封装的目的。

程序如下:

package Multithread;

//import java.util.concurrent.*;

class ThreadObject1 implements Runnable {

private ThreadObject2 threadObject2 ;

public ThreadObject1(ThreadObject2 threadObject2) {  //传入另外一个对象ThreadObject2

this.threadObject2 = threadObject2 ;

}

public void run() {

try {

//TimeUnit.SECONDS.sleep(3);

System.out.println(“i’m going.”);

threadObject2.SendMessage();     //修改另外对象ThreadObject2的成员变量,从而改变基于threadObject2对象的线程的运行状态

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

class ThreadObject2 implements Runnable {

private volatile boolean go = false;

public void SendMessage() throws InterruptedException {  //修改成员变量状态

go = true;

}

public void waiting() {     //忙等待,遇到go的状态变为true则跳出循环。

while (go == false)

;

System.out.println(“He has gone.”);

}

public void run() {

waiting();

}

}

public class BusyWaiting {

public static void main(String[] args) {

ThreadObject2 threadObject2 = new ThreadObject2();

ThreadObject1 threadObject1 = new ThreadObject1(threadObject2);

new Thread(threadObject1).start();

new Thread(threadObject2).start();

}

}

程序运行结果:

i’m going.

He has gone.

以上其实总共有三个线程,一个主线程,两个子线程。对于希望简化只需要通过主线程控制子线程中断的话,可以通过如下代码实现。

class Example2 extends Thread {




volatile boolean stop = false;// 线程中断信号量



public static void main(String args[]) throws Exception {




Example2 thread = new Example2();



System.out.println(“Starting thread…”);



thread.start();



Thread.sleep(3000);



System.out.println(“Asking thread to stop…”);



// 设置中断信号量



thread.stop = true;



Thread.sleep(3000);



System.out.println(“Stopping application…”);



}



public void run() {




// 每隔一秒检测一下中断信号量



while (!stop) {




System.out.println(“Thread is running…”);



long time = System.currentTimeMillis();



/*



* 使用while循环模拟 sleep 方法,这里不要使用sleep,否则在阻塞时会 抛



* InterruptedException异常而退出循环,这样while检测stop条件就不会执行,



* 失去了意义。



*/



while ((System.currentTimeMillis() – time < 1000)) {}



}



System.out.println(“Thread exiting under request…”);



}

}




版权声明:本文为tuohuang0303原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。