黑马程序员技术交流社区
标题:
线程问题,求解答
[打印本页]
作者:
宋旭东
时间:
2013-7-4 16:56
标题:
线程问题,求解答
多线程的问题:
就那毕老师视频中讲的那个售票程序来说吧
1,为啥里面要用死循环啊?while(true)
2,多线程里面加上了同步代码块,牺牲了程序的性能提高了安全性,那这里岂不是和单线程一样?
还是说:同步代码块只是程序的一小部分,只有在运行到这里时才会单线程运行,代码块外还是提高了效率?有点晕晕呼呼的,麻烦大家结合好懂的例子
说一下多线程加上同步代码块,是不是和直接单线程一样了??
/*
* 4个窗口同时售票,总票数为100张,多线程思想
*/
//定义一个类去实现Runnable接口,这种方法避免了单继承的局限性,
class Ticket implements Runnable{
private int ticket=100;
//Runnable中只有一个run方法,用于存储线程汇总运行的代码,被实现需要覆盖该方法,
public void run(){
//1,为什么要定义成死循环??又或者说是不是在知道循环次数是时就可以不定义成死循环了?
while(true){
//同步代码块
synchronized(this){
//用于检测程序的安全性,而sleep()方法中有可能引发一场,所以要用try..catch,否则编译出错.
//Thread.sleep()让线程进入睡眠,模拟现实中临时故障的发生
try{
Thread.sleep(10);
}
catch(Exception e){
System.out.println(e.getMessage());
}
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"刚刚售卖完第"+ticket--+"张票");
}
}
}
}
}
public class TicketTest {
public static void main(String[] args){
Ticket tk=new Ticket();
/*创建四个线程,开了四个窗口,Thread类中有Thread(Runnable target)构造方法,当向该方法传递
Runnable接口的类对象时,创建的线程会直接调用类对象中的run()方法作为它的运行代码.*/
Thread t1=new Thread(tk);
Thread t2=new Thread(tk);
Thread t3=new Thread(tk);
Thread t4=new Thread(tk);
//给线程取名字,纯属好看
t1.setName("1号窗口");
t2.setName("2号窗口");
t3.setName("3号窗口");
t4.setName("4号窗口");
//使线程开始执行
t1.start();
t2.start();
t3.start();
t4.start();
作者:
chslzj
时间:
2013-7-5 12:52
加上了synchronized 的代码,当有一个线程访问了,其他线程就无法访问,只有当当前线程访问结束,其他线程才能访问
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2