多线程的问题:
就那毕老师视频中讲的那个售票程序来说吧
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();
|