高分求解---有个问题从大四开始就在困扰我,一直不知道怎么解决! Java多线程唤醒 等待 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我做的是一个socket文件上传和接收的,用的线程池。大概意思是这样的:服务器段总带宽大小为5M/秒,每个用户上传一个文件,服务器端开启一个线程,socket接收文件的速度是5M/总共上传文件的数量。如果是文件小的优先,那么就把文件大的线程暂停,等小的传递完毕,再把大文件的那个线程打开。 用一个控制中心接收输入。在线程中用一个变量表示要wait。当收到wait命令时修改这个变量的值表示要wait,当收到wake命令时调用线程的notify。或者用Seamphore的机制也可以,就是调用release和acquire. 做了个假的阻塞,用flag来控制,当要wait的时候flag=false,当wake的时候flag=true。其实线程还是在运行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(); } } } }} Sorry,童鞋,暂时不能给你分,这个程序一跑,我的CPU占用率已经超过90%了。 关于JAVA引用数据类型的问题 iframe打印的问题 jtextfield焦点的问题,主要是有对话框就不行了。 jcreater 题目求解答 请达人指教:如何用鼠标事件读出来的坐标取得JLabel上相应点上的元素 请问是否可以在java世界里调用微软的office对象? 用Jcreator能不能生成exe文件? 如何通过JDBC获得某个表的关键字段? 关于JDBC得简单问题,高手新手请进来一看啊。帮个忙 请教一个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();
}
}
}
}}