一个业务Object
A--->是一个Runnable 设置object可用
B--->是一个Runnable 设置object不可用
C--->是一个Runnable 使用object也就是当A运行后 要通知C实例都恢复 B运行后 C的实例都挂起。
A--->是一个Runnable 设置object可用
B--->是一个Runnable 设置object不可用
C--->是一个Runnable 使用object也就是当A运行后 要通知C实例都恢复 B运行后 C的实例都挂起。
解决方案 »
- netbeans下使用spring的问题
- [Swing]如何设置文本框默认得到焦点
- sqlserver的驱动类不支持getMaxConnections()方法吗?
- java MD5加密算法问题
- 哪有包含jaxb的jwsdp-2_0-windows-i586文件下载? sun的网站下载不了
- 你精通正则表达式吗?不妨进来瞧瞧!
- 关于构造方法的小问题
- 有关jdk1.4.0和jdk1.2.2在accessibility方面的冲突:::在线等待加分200
- 奇怪:为什么for循环插入10条记录总是异常呢? 大家帮忙看看,谢谢了
- java有关汉字字节判断的问题(面试题)
- 关于对象的判断的,请大家看看
- java十转二
不然就需要有个共享变量Flag来控制了
A运行的时候改变Flag为可用,如果Flag变了就挂起
B运行的时候改变Flag为不可用,如果Flag变了就挂起学习中
C是一条一直运行中的线程B就是对C进行wait() A对C进行notify()
补充一下具体业务吧 其实就这个功能一个ConnectNet.java GetNetData.java
其中 ConnectNet.java 中含有连网断网功能
GetNetData.java 获取数据的Runnable,当断网时 GetNetData挂起
连网后GetNetData恢复细节功能不用实现 只需要简单打印一下就好 主要是多线程的设计
/**
*
*/
package cn.luochengor.csdn;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;/**
* 一个业务Object
* A--->是一个Runnable 设置object可用
* B--->是一个Runnable 设置object不可用
* C--->是一个Runnable 使用object
*
* @Author luochengor
* @Date Oct 21, 2011
* @Email [email protected]
*/
public class ThreadTest { /**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
BusinessObject bObject = new BusinessObject();
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new C(bObject));
exec.execute(new A(bObject));
exec.execute(new B(bObject));
TimeUnit.SECONDS.sleep(5);
exec.shutdownNow();
}}class BusinessObject {
private boolean isEnable = false;
public synchronized void enable() {
this.isEnable = true;
notifyAll();
}
public synchronized void disable() {
this.isEnable = false;
notifyAll();
}
public synchronized void waitForEnable() throws InterruptedException {
while (!isEnable) {
wait();
}
}
public synchronized void waitForDisable() throws InterruptedException {
while (isEnable) {
wait();
}
}
public synchronized void doWork() throws InterruptedException {
while (!isEnable) {
System.out.println("class C is suspended.\r");
wait();
}
System.out.println("BesinessObject do something.");
}
}class A implements Runnable {
private BusinessObject bObject;
public A (BusinessObject bObject) {
this.bObject = bObject;
}
@Override
public void run() {
try {
while (!Thread.interrupted()) {
TimeUnit.MILLISECONDS.sleep(600);
bObject.enable();
System.out.println("class A enable BusinessObject.");
bObject.waitForDisable();
}
} catch (InterruptedException e) {
System.out.println("InterruptedException class A");
}
System.out.println("Ending class A Task");
}
}class B implements Runnable {
private BusinessObject bObject;
public B (BusinessObject bObject) {
this.bObject = bObject;
}
@Override
public void run() {
try {
while (!Thread.interrupted()) {
TimeUnit.MILLISECONDS.sleep(600);
bObject.disable();
System.out.println("class B disable BusinessObject.");
bObject.waitForEnable();
}
} catch (InterruptedException e) {
System.out.println("InterruptedException class B");
}
System.out.println("Ending class B Task");
}
}class C implements Runnable {
private BusinessObject bObject;
public C (BusinessObject bObject) {
this.bObject = bObject;
}
@Override
public void run() {
try {
while (!Thread.interrupted()) {
bObject.doWork();
TimeUnit.MILLISECONDS.sleep(200);
}
} catch (InterruptedException e) {
System.out.println("InterruptedException class C");
}
System.out.println("Ending class C Task");
}
}
运行结果(参考):class C is suspended.BesinessObject do something.
class B disable BusinessObject.
class A enable BusinessObject.
BesinessObject do something.
BesinessObject do something.
class B disable BusinessObject.
class C is suspended.class A enable BusinessObject.
BesinessObject do something.
BesinessObject do something.
BesinessObject do something.
class B disable BusinessObject.
class C is suspended.class A enable BusinessObject.
BesinessObject do something.
BesinessObject do something.
BesinessObject do something.
class B disable BusinessObject.
class C is suspended.class A enable BusinessObject.
BesinessObject do something.
BesinessObject do something.
BesinessObject do something.
class B disable BusinessObject.
class C is suspended.InterruptedException class C
Ending class C Task
InterruptedException class B
InterruptedException class A
Ending class A Task
Ending class B Task
太夸张了吧,我刚好前段时间在补习多线程,看了《Java编程思想》,这是按照里面的一个例子改的,你还是看书吧,把里面的例子都敲一遍,理解一遍,应该会有较大帮助的。
呵呵 我目前工作上不用java 以前学过java 好久都没弄了 最近自己研究点东西遇到这样个业务 搞不定了。
线程那一直没弄太明白