多线程情况下调试,经常“没有响应”,这是为什么?(超强高手请进) 我共有A,B,C三个线程。断点在A上,可是B和C依然处于运行状态。因为B和C运算量比较大。使在A 上的断点总是无法执行下去。如果把B和C强行suspend掉,程序就未响应了。高手大侠们,请你们教我下。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 打印输出固然可以,但我想查看一个变量在多个线程间改变时值的变化情况。如果sysout太烦了,关键是会遗漏有些地方的。 package Thread;public class TwoThread { public static void main(String[] args) { Queue q=new Queue ();//new出一个q:后面的两个线程都是用的同一个q,保证一个put一个get Producer p=new Producer (q);//让new出的p去往q里面put Customer c=new Customer (q);//让new出的c从q中get p.start();//p和q开始的顺序并不报错 c.start(); }}class Producer extends Thread{ Queue q; public Producer(Queue q) { this.q=q;//给成员变量赋值,再一调运q的put方法 } @Override public void run() { for (int i = 0; i < 10; i++) { q.put(i);//此处只是让q去put 10次 System.out.println("Producer put "+i);//并且输出本次放的是第几杯 } }}class Customer extends Thread{ Queue q; public Customer(Queue q) { this.q=q;//给成员变量赋值,再一调运q的get方法 } @Override public void run() { while (true) {//死循环:只要q里面有,就去get //get方法有返回值,返回值就是producer所put的数量 //此处也不需要去考虑是第几杯 //在Queue中的value解决可这一问题: //put中的I赋给value,get方法有返回值就value的值 System.out.println("Customer get "+q.get()); //如果循环完了,就跳出循环,否则线程不会自己结束 if (q.value==9) { break; } } }}class Queue{ int value; boolean bFull=false; public synchronized void put (int i)//在producer中的put方法中就是将其I传进来 { if (!bFull) {//条件为真(如果没满,就倒水) value=i;//给value赋值,现在有几杯水 bFull=true;//满了 notify();//唤醒其他线程(让customer去get) } try { wait();//告诉customer去get后自己等待customer的get结束 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public synchronized int get() { if (!bFull) {//如果没满就等待,如果满了就不进 **这就是为什么main里面谁先开始不报错的原因** //get和put方法中的if条件判断起到了至关重要的作用 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } bFull =false;//赋值为没满 notify();//唤醒producer去put return value;//get的返回值就是put的时候给value赋的值 }} 请问什么是 闭包? 多个list排序 我初学swing,有这么几个不懂的地方,请教大家: 用GridBagLayout模拟BorderLayout Together 6.1 for eclipse注册码? 求救!发现X11GraphicsEnvironment错误!解决者500分重奖!! 各位朋友想一下:为什么jb的光标定位不对?如何解决? 为什么120/240的结果不是0.5 学习java的困惑. java学习中碰到的 疑难杂症!!!! 请问和数据库保持连接会占用什么资源 急JAVA
如果sysout太烦了,关键是会遗漏有些地方的。
public static void main(String[] args) {
Queue q=new Queue ();//new出一个q:后面的两个线程都是用的同一个q,保证一个put一个get
Producer p=new Producer (q);//让new出的p去往q里面put
Customer c=new Customer (q);//让new出的c从q中get
p.start();//p和q开始的顺序并不报错
c.start();
}
}
class Producer extends Thread
{
Queue q;
public Producer(Queue q) {
this.q=q;//给成员变量赋值,再一调运q的put方法
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
q.put(i);//此处只是让q去put 10次
System.out.println("Producer put "+i);//并且输出本次放的是第几杯
}
}
}
class Customer extends Thread
{
Queue q;
public Customer(Queue q) {
this.q=q;//给成员变量赋值,再一调运q的get方法
}
@Override
public void run() {
while (true) {//死循环:只要q里面有,就去get
//get方法有返回值,返回值就是producer所put的数量
//此处也不需要去考虑是第几杯
//在Queue中的value解决可这一问题:
//put中的I赋给value,get方法有返回值就value的值
System.out.println("Customer get "+q.get());
//如果循环完了,就跳出循环,否则线程不会自己结束
if (q.value==9) {
break;
}
}
}
}
class Queue
{
int value;
boolean bFull=false;
public synchronized void put (int i)//在producer中的put方法中就是将其I传进来
{
if (!bFull) {//条件为真(如果没满,就倒水)
value=i;//给value赋值,现在有几杯水
bFull=true;//满了
notify();//唤醒其他线程(让customer去get)
}
try {
wait();//告诉customer去get后自己等待customer的get结束
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized int get()
{
if (!bFull) {//如果没满就等待,如果满了就不进 **这就是为什么main里面谁先开始不报错的原因**
//get和put方法中的if条件判断起到了至关重要的作用
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
bFull =false;//赋值为没满
notify();//唤醒producer去put
return value;//get的返回值就是put的时候给value赋的值
}
}