Java基础针对自己薄弱环节总结08(线程上)

一、线程

a)        概述

宏观来讲

     进程:就是正在运行的程序

     线程:就是进程的执行路径,执行单元

b)       创建线程的两个方式

            i. 定义一个类继承Thread

  public class A extends Thread{

          }

  new A().start();

            ii. 定义一个类实现Runnable

  public class A implements Runnable{

               public void run(){

               }

   }

   new Thread(new A()).start();

c)        线程的随机性原理

多个程序实际是通过CPU在做高效切换实现的

d)       线程的生命周期

新建 --> 就绪 --> 运行 -->阻塞 --> 死亡


e)        卖票的例子

packagecn.itcast.thread;
/**
 * 卖票资源类
 *
 * @author LBK
 *
 */
public classRunnableForTickets implements Runnable {
       private static int tickets = 100;
 
       @Override
       public void run() {
              while (true) {
                     if (tickets > 0) {
                            try {
                                   Thread.sleep(500);
                            } catch(InterruptedException e) {
                                   // TODOAuto-generated catch block
                                   e.printStackTrace();
                            }
 
                            System.out.println(Thread.currentThread().getName()+ "正在出售第"
                                          +tickets-- + "张票");
                     } else {
                            break;
                     }
              }
       }
}


package cn.itcast.thread;
/**
 * 测试类
 * @author LBK
 *
 */
public class TicketThread {
	public static void main(String[] args) {
		RunnableForTickets runnable=new RunnableForTickets();
		Thread t1=new Thread(runnable,"窗口一");
		Thread t2=new Thread(runnable,"窗口二");
		Thread t3=new Thread(runnable,"窗口三");
		t1.start();
		t2.start();
		t3.start();
	}
}

问题出现原因:

比如现在票数是1张,线程三抢到CPU执行然后休眠

此时线程二抢到CPU执行,也是1>0,符合条件,然后休眠,

线程三减一以后,线程二也要减一,遍出现了-1张的情况。

 

如何查找多线程是否存在问题呢?

       查看是否有共享数据

       看操作共享数据的语句是不是多条

       看是不是在多线程环境中

解决方案:加锁

packagecn.itcast.thread;
 
/**
 * 卖票资源加锁了类
 *
 * @author LBK
 *
 */
public classRunnableForTickets implements Runnable {
       private static int tickets = 100;
       private Object lock = new Object();
 
       @Override
       public void run() {
              while (true) {
                     synchronized (lock) {
                            if (tickets > 0){
                                   try {
                                          Thread.sleep(500);
                                   } catch(InterruptedException e) {
                                          //TODO Auto-generated catch block
                                          e.printStackTrace();
                                   }
                                   System.out.println(Thread.currentThread().getName()
                                                 +"正在出售第" +tickets-- + "张票");
                            } else {
                                   break;
                            }
                     }
              }
       }
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值