黑马程序员技术交流社区
标题:
多线程的一些问题求解
[打印本页]
作者:
暗夜星辰
时间:
2014-6-11 09:55
标题:
多线程的一些问题求解
1.多线程中采用继承Thread的方法后,run()方法中代码不能被不同对象共享,而实现Runnable接口后就能被共享?
2.同步代码块中放的是操作共享数据的语句,但是怎么才能知道这些语句是共享数据?以下代码中的问题希望各位大大能帮忙解释下,谢谢!
class Ticket implements Runnable//extends Thread
{
private int num = 100;
Object obj = new Object();
public void run()
{
int z = 10; //为什么这句代码不用同步?
while(true) //为什么把这个while循环去掉后,结果和原来的差别很大?while循环在这里的作用是什么?
{
if(num>0)
{
try{Thread.sleep(10);}catch (InterruptedException e){}
System.out.println(Thread.currentThread().getName()+".....sale...."+num--);
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();//创建一个线程任务对象。
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
复制代码
作者:
123_yaya
时间:
2014-6-11 10:16
1.多线程中采用继承Thread的方法后,run()方法中代码不能被不同对象共享,而实现Runnable接口后就能被共享?
这个问题,我觉得是看情况定的哦。
你看嘛,如果是继承Thread的话,你开启多个线程的的方法只能是,
Ticket t1=new Ticket();
Ticket t2=new Ticket();
t1.start();
t2.start();
复制代码
这样子你就开启了多个不同的对象,t1,t2,t1有自己的num,t2也有自己的num,所以这里的num不是这个几个对象共享的一个num。而如果你是实现Runnable接口的话,你启动多个线程的方法是,
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
复制代码
这里只是实例化了一个对象t,然后把t传到new Thread()中,所以t1,t2是共享一个t,也就共享一个t中的num。
如果你在这里把上面代码改为
Ticket t1 = new Ticket();
Ticket t2=new Ticket();
Thread th1 = new Thread(t1);
Thread th2 = new Thread(t2);
复制代码
那也是一样的共享不是同一个num。你可以放在代码中测试一下,加深理解。
作者:
123_yaya
时间:
2014-6-11 10:23
while(true) //为什么把这个while循环去掉后,结果和原来的差别很大?while循环在这里的作用是什么?
复制代码
线程创建是new出来一个实例。线程start()是,开启了一个线程,并且执行线程里面的run方法里面的代码。线程结束是,当run方法的代码执行完了。毕向东老师视频里面的加了while(true)只是让大家看线程不安全出现的效果的。实际程序运行时是不会自动结束的。老师想结束的时候是按快捷键强行退出的。另外后面会讲线程怎么结束。线程的结束的方法的就是run方法代码执行完,以后你可以把while括号里面的ture换成flag,在程序外面不想让线程执行的时候,就执flag标识为false。到时候学到你可以总结一下。
作者:
123_yaya
时间:
2014-6-11 10:30
至于共享数据。你就要理解题目的意思了。现实生活中,列车有多少个座位就有多少张票。你在A窗口可以买票,也可以在B窗口买票,AB窗口同时售票票就相当于开启AB这两个线程。而票是共享的就是A窗口买的就是这堆票,B窗口买的也是这一堆票。而你问题的z代表什么都没意义。
作者:
暗夜星辰
时间:
2014-6-11 10:49
123_yaya 发表于 2014-6-11 10:30
至于共享数据。你就要理解题目的意思了。现实生活中,列车有多少个座位就有多少张票。你在A窗口可以买票, ...
谢谢大大的讲解,很详细,谢谢!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2