JAVA多线程
Thread与Runnable区别
- 首先,根据源码可以知道Thread实现了Runnable接口,在执行多线程主体之前,他还干了一些其他的事情,比如说分配CPU资源,检查线程是否启动等事情,然后再执行线程主题。
- Runnable适合多个相同程序代码的线程去处理同一个资源,比如买票程序。
- Runnable接口可以避免JAVA单继承的局限。
- Runnable增加了程序的健壮性,代码能够被多个线程所共享,数据和代码是独立的。
线程调用Start()方法不会立刻启动,而是处于就绪状态。等待CPU调度以后才可以。
多线程操作
- isAlive()
- Thread.currentThread.getName()
- join() :线程强制运行
- Thread.sleep(): 线程休眠
- 线程中断:interrupt(),在其他线程中调用t.interrupt(),t线程被中断
- setDaemon(), 设置后台线程,这样可以在主线程结束的时候它依然在运行
- 优先级:setPriority();主方法优先级是NORM
- 线程礼让:yield()
同步与死锁
资源共享时需要同步,过多同步容易产生死锁。
- 同步代码块:synchronized(this){}
class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void run(){ for(int i=0;i<100;i++){ synchronized(this){ // 要对当前对象进行同步 if(ticket>0){ // 还有票 try{ Thread.sleep(300) ; // 加入延迟 }catch(InterruptedException e){ e.printStackTrace() ; } System.out.println("卖票:ticket = " + ticket-- ); } } } } }; public class SyncDemo02{ public static void main(String args[]){ MyThread mt = new MyThread() ; // 定义线程对象 Thread t1 = new Thread(mt) ; // 定义Thread对象 Thread t2 = new Thread(mt) ; // 定义Thread对象 Thread t3 = new Thread(mt) ; // 定义Thread对象 t1.start() ; t2.start() ; t3.start() ; } };
同步方法:
class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void run(){ for(int i=0;i<100;i++){ this.sale() ; // 调用同步方法 } } public synchronized void sale(){ // 声明同步方法 if(ticket>0){ // 还有票 try{ Thread.sleep(300) ; // 加入延迟 }catch(InterruptedException e){ e.printStackTrace() ; } System.out.println("卖票:ticket = " + ticket-- ); } } }; public class SyncDemo03{ public static void main(String args[]){ MyThread mt = new MyThread() ; // 定义线程对象 Thread t1 = new Thread(mt) ; // 定义Thread对象 Thread t2 = new Thread(mt) ; // 定义Thread对象 Thread t3 = new Thread(mt) ; // 定义Thread对象 t1.start() ; t2.start() ; t3.start() ; } };
- 程序中过多的同步会产生死锁。