public class TestThread implements Runnable {
private int x = 100; public void run() {
try
{
test();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public synchronized void test() throws InterruptedException {
x -= 10;
Thread.sleep(4000);
System.out.println("x = " + x);
} public static void main(String[] args) throws Exception{
TestThread tt1 = new TestThread();
TestThread tt2 = new TestThread();
Thread t1 = new Thread(tt1);
t1.start();
Thread.sleep(2000);
tt1.test(); //(*)
tt2.test(); //(**)
}
}(**)这一句注释掉的结果为: | (*)句注释掉的结果:
x = 90 (约共等待4s) | x = 90 (约共等待4s)
x = 80 (约共等待8s) | x = 90 (约共等待6s)
右边的结果好理解,左边的有一点不理解:
1)TestThread是一个线程类,那么它的对象tt1 和 用tt1 构造出来的Thread对象t1是什么关系?
2)test()是同步方法,如果t1和tt1是两个无关的类对象,那么同步对于他们是没有影响的,就如同右边的结果一样,但是左边的结果应该是tt1.test()是在t1线程结束之后才开始运行的,为什么?
private int x = 100; public void run() {
try
{
test();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public synchronized void test() throws InterruptedException {
x -= 10;
Thread.sleep(4000);
System.out.println("x = " + x);
} public static void main(String[] args) throws Exception{
TestThread tt1 = new TestThread();
TestThread tt2 = new TestThread();
Thread t1 = new Thread(tt1);
t1.start();
Thread.sleep(2000);
tt1.test(); //(*)
tt2.test(); //(**)
}
}(**)这一句注释掉的结果为: | (*)句注释掉的结果:
x = 90 (约共等待4s) | x = 90 (约共等待4s)
x = 80 (约共等待8s) | x = 90 (约共等待6s)
右边的结果好理解,左边的有一点不理解:
1)TestThread是一个线程类,那么它的对象tt1 和 用tt1 构造出来的Thread对象t1是什么关系?
2)test()是同步方法,如果t1和tt1是两个无关的类对象,那么同步对于他们是没有影响的,就如同右边的结果一样,但是左边的结果应该是tt1.test()是在t1线程结束之后才开始运行的,为什么?
解决方案 »
- java中main参数传入值的问题
- 字体的问题?
- 大家帮帮忙啊?我要做个工具栏控件,当工具条的宽度比全部工具条按钮的宽度和小时,需要将显示不了的按钮放在一个扩展按钮的下拉列表中(
- java 连接 mysql 错误信息
- java文件操作问题
- 谁有jacob方面比较详细的资料啊,谢谢
- JMenuItem和JCheckBoxMenuItem以及JRadioButtonMenuItem的问题!
- 谁有Jbuilder7.0的serial number和key
- JB5安装问题,分不够可以在加!
- 关于内部类?
- 为什么import java.awt.*之后还要import java.awt.event.*?
- 请教关于method override
不对 TestThread不是线程类 只是实现了Runnable接口
可以用来传给Thread 构建Thread 对象通俗点说:tt1 ,tt2 是t1得要执行得任务
t1,tt2 是执行不同的对象的test方法 所以可以并行
Thread t1 = new Thread(tt2);你这样改 就是另外一种情况