Java多线程之间通信——修改对象中的成员变量
2014-12-20 12:45
239 查看
线程之间的通信,可通过对对象的成员变量的状态修改,达到控制线程的目的。
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...");
}
}
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...");
}
}
相关文章推荐
- java 多线程(4) 线程同步之锁(synchronized) / 死锁 / 两个锁定对象期间访问(修改)其变量的面试
- android NDK 入门之在JNI中修改java中对象的成员变量的值
- Java 多线程编程之六:线程之间的通信(附源代码)
- JAVA面向对象基础:成员变量、方法、方法的重载、构造函数
- java个人学习笔记06(类、对象、成员变量、局部变量)
- 黑马程序员:Java基础——多线程之间的通信
- Java 多线程访问成员变量与局部变量
- java多线程之间的通信
- java---面向对象vs面向过程,局部变量vs成员变量
- java 多线程对成员变量与局部变量的影响
- java 反射技术 打印类成员变量的值(查看一个对象的成员数据时十分方便)
- Java中创建对象时,初始化成员变量的代码的执行顺序
- Java 多线程编程之六:线程之间的通信(附源代码)
- 学习java多线程的笔记3-使用BlockingQueue阻塞队列来模拟两个线程之间的通信
- java个人学习笔记18(多线程之间通信+等待唤醒机制)
- 21天学通Java调用不存在的对象或成员变量
- Java中成员变量和属性之间的关系
- java中对象、成员变量、静态变量、方法的内存分配
- java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况
- Java 多线程编程之六:线程之间的通信(附源代码)