解决方案 »
- 一个JFrame里显示多个jfreechart图,怎么做?(在线结贴)
- ObjectInputStream如果从txt文件中读取2个java类?ObjectInputStream的实例也没有next方法呀?如何判断……
- 一个小的FileWriter问题;
- JSP连接数据库的小程序,帮我看看错在哪?
- 为什么重新绘制的时候屏幕一闪一闪的?
- 一个零件由一个厂家生产,一个厂家生产多种零件,画出E-R图
- 一个城市高新开发区,信息化建设内容??
- 郁闷 怎么编译时 提示 file no found 菜鸟问题
- 大家说Java Network Programming这本书怎么样?
- 如此简单的一个异常捕获怎么捕获不了
- 请教一个Java语言的SE的Swing JButton按钮的监视器添加的技术问题.
- 学生党急求大神为文本添加一个自动保存!
在线程中用一个变量表示要wait。
当收到wait命令时修改这个变量的值表示要wait,
当收到wake命令时调用线程的notify。
或者用Seamphore的机制也可以,就是调用release和acquire.
public void run() {
while (!Thread.currentThread().isInterrupted()) {
while (flag) {
try {
//do something
Thread.sleep(2000);
System.out.println(this.id);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
if(!flag){
this.sleep(1000);
}
System.out.println(this.id);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
就是无法把sleep改成wait(),不知道为什么,请大神求解
稍微做了下,不知道是否满足要求,一共两个类。因为电脑的问题,我指做了3个线程,10个就卡死了
package com.thread;import java.util.*;
import java.util.Map.Entry;
import java.io.*;public class TestThread {
HashMap<Integer, Td> hm;
String no; public static void main(String[] args) {
TestThread tt = new TestThread();
while (true) {
tt.showMenu(); try {
BufferedReader strin = new BufferedReader(
new InputStreamReader(System.in));
tt.no = strin.readLine();
} catch (IOException e) {
e.printStackTrace();
} switch (tt.no) {
case "1":
tt.showWaitThread(tt.hm);
System.out.println("请输入要选择的线程号:");
try {
BufferedReader strin = new BufferedReader(
new InputStreamReader(System.in));
tt.no = strin.readLine();
} catch (IOException e) {
e.printStackTrace();
}
tt.setWait(Integer.parseInt(tt.no));
break;
case "2":
tt.showWakeThread(tt.hm);
System.out.println("请输入要选择的线程号:");
try {
BufferedReader strin = new BufferedReader(
new InputStreamReader(System.in));
tt.no = strin.readLine();
} catch (IOException e) {
e.printStackTrace();
}
tt.setWake(Integer.parseInt(tt.no));
break;
case "3":
// 显示所有线程的情况
tt.showThread(tt.hm);
break;
case "4":
System.exit(0); }
}
} public TestThread() {
hm = new HashMap<Integer, Td>();
for (int n = 1; n <= 3; n++) {
Td t = new Td(n);
hm.put(n, t);
t.start();
}
} public void showMenu() {
System.out.println("菜单");
System.out.println("1 阻塞线程");
System.out.println("2 唤醒线程");
System.out.println("3 显示线程情况");
System.out.println("4 退出");
System.out.println("请输入你要的选择:");
} public void showThread(HashMap hm) {
Iterator a = hm.entrySet().iterator();
while (a.hasNext()) {
Entry t = (Entry) a.next();
System.out.println("第 " + t.getKey() + " 号线程的状态是: "
+ ((Td) t.getValue()).getState());
}
} public void showWaitThread(HashMap hm) {
Iterator a = hm.entrySet().iterator();
while (a.hasNext()) {
Entry t = (Entry) a.next();
if (((Td) t.getValue()).getState().toString().equals("RUNNABLE")) {
System.out.println("第 " + t.getKey() + " 号线程的状态是: "
+ ((Td) t.getValue()).getState());
}
}
}
public void showWakeThread(HashMap hm) {
Iterator a = hm.entrySet().iterator();
while (a.hasNext()) {
Entry t = (Entry) a.next();
if (((Td) t.getValue()).getState().toString().equals("WAITING")) {
System.out.println("第 " + t.getKey() + " 号线程的状态是: "
+ ((Td) t.getValue()).getState());
}
}
}
public void setWait(int n) { hm.get(n).setFlag(false); } public void setWake(int n) {
Td tmp = hm.get(n);
tmp.setFlag(true);
synchronized (tmp) {
tmp.notify();
}
}
}package com.thread;public class Td extends Thread { int id;
boolean flag; public boolean isFlag() {
return flag;
} public void setFlag(boolean flag) {
this.flag = flag;
} public Td(int id) {
this.id = id;
flag = true;
} @Override
public void run() {
synchronized (this) { while (!Thread.currentThread().isInterrupted()) {
try {
if (!flag) {
wait();
}
//sleep(3000);
// System.out.print(this.id);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}}