关于java多线程机制的疑惑 本帖最后由 l514941630 于 2010-09-21 10:09:30 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你把System.out.println(Thread.currentThread() + "等待对象b完成计算"); 这段写在run方法里面试试就知道了. 当一个对象建立的时候! 他就是一个自己的主线程,在这里他是B线程的拥有者,但必不表示,他必须首先执行b,他要等到自己执行完了以后,释放了线程锁,才开始执行B的!!不知道自己理解的对不对!! 显示的是Thread[Thread-0,5,main]等待对象b完成计算 是啥意思呢? 哦, 我也搞糊涂了. 为了这个查了一番资料. 我也学习了.下面是JAVA API中对currentThread方法的描述currentThreadpublic static Thread currentThread()返回对当前正在执行的线程对象的引用。 返回:当前执行的线程。当前执行的线程. 不论你做什么操作, 他只返回当前执行的线程. 主线程的synchronized已经把对象锁住,防止有其他线程在主线程使用该对象的时候侵占b。对你的代码我的理解是:主线程已经在使用了b对象,那么如果有一个新的线程如果也想使用b的话就会阻塞:package csdn.javase.thread;public class ThreadA { public static void main(String[] args) { //改了下,内部类的参数都要声明为final的 final ThreadB b = new ThreadB(); b.start(); synchronized (b) { try { System.out.println(Thread.currentThread() + "等待对象b完成计算"); /*这里是主线程在执行,它把对象锁住了,与b自身的执行无关,把打印语句放进b里面是打印b线程的了: * Thread[Thread-0,5,main]等待对象b完成计算 * */ Thread.sleep(1000); b.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("b对象计算的总和是:" + b.total); } //启动新的进程去锁住b试试 new Thread(){ public void run(){/* * 把注释去掉的话就是同步访问对象b,会被阻塞 *//* synchronized (b){ try{ b.run(); b.wait(); }catch(InterruptedException e){ e.printStackTrace(); } }*/ /*尝试以非同步的方式调用对象b的方法时会报错,提示你当前对象不是b资源的拥有者: * * * Exception in thread "Thread-1" java.lang.IllegalMonitorStateException: current thread not owner */ try{ b.run(); b.wait(); }catch(InterruptedException e){ e.printStackTrace(); } } }.start(); } }应该是这样的。呵呵,菜鸟拙见,期待高手们的答案。 1. 你这句 System.out.println(Thread.currentThread() + "等待对象b完成计算"); 确实是在主线程执行的, 所以Thread.currentThread() 是main完全没有问题。 也许你说main启动了新线程啊,可这并不影响主线程的执行。你把启动线程当成一句普通的代码好了.2. 楼主可以在 ThreadB的run方法加一句:System.out.println(Thread.currentThread() + "b完成计算");你会发现这个 Thread.currentThread()就不是main,它是Thread-1 (这个线程默认的名字) synchronized(b)与当前运行线程没有任何关系,这个调用不会使得当前线程变换。它的意思只是取得对象b的锁,b是否线程对象没有任何关系。在Java中,任何一个对象都有一个锁,都可以通过synchronized关键字取得这个对象的锁 凭感觉,应该把主线程先sleep下 转成16进制,在线等 java中 float求和的小数点精度问题 java 随机中文验证码 找了份新工作,散点分? 如何添加一个在swing的frame按下esc的退出事件 java中有显示日历的组件吗? 大家用过混淆器吗,给我推荐一个好吗? java数组问题 第二次问同样的问题,难道真没有人知道答案吗? 求助,java GUI 程序怎么实现TreeTable树形表格啊_(:」∠)_ 一个网络编程的问题(私聊问题) Thinking in Java里的一个包
System.out.println(Thread.currentThread() + "等待对象b完成计算");
这段写在run方法里面试试就知道了.
不知道自己理解的对不对!!
下面是JAVA API中对currentThread方法的描述currentThread
public static Thread currentThread()返回对当前正在执行的线程对象的引用。 返回:
当前执行的线程。
当前执行的线程. 不论你做什么操作, 他只返回当前执行的线程.
public static void main(String[] args) {
//改了下,内部类的参数都要声明为final的
final ThreadB b = new ThreadB();
b.start();
synchronized (b) {
try {
System.out.println(Thread.currentThread() + "等待对象b完成计算");
/*这里是主线程在执行,它把对象锁住了,与b自身的执行无关,把打印语句放进b里面是打印b线程的了:
* Thread[Thread-0,5,main]等待对象b完成计算
* */
Thread.sleep(1000);
b.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b对象计算的总和是:" + b.total);
}
//启动新的进程去锁住b试试
new Thread(){
public void run(){
/*
* 把注释去掉的话就是同步访问对象b,会被阻塞
*/
/* synchronized (b){
try{
b.run();
b.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}*/
/*尝试以非同步的方式调用对象b的方法时会报错,提示你当前对象不是b资源的拥有者:
* *
* Exception in thread "Thread-1" java.lang.IllegalMonitorStateException: current thread not owner
*/
try{
b.run();
b.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
}.start();
}
}应该是这样的。呵呵,菜鸟拙见,期待高手们的答案。
也许你说main启动了新线程啊,可这并不影响主线程的执行。你把启动线程当成一句普通的代码好了.2. 楼主可以在 ThreadB的run方法加一句:System.out.println(Thread.currentThread() + "b完成计算");你会发现这个 Thread.currentThread()就不是main,它是Thread-1 (这个线程默认的名字)
它的意思只是取得对象b的锁,b是否线程对象没有任何关系。
在Java中,任何一个对象都有一个锁,都可以通过synchronized关键字取得这个对象的锁