线程
#### 概念



什么是叫一个进程? 什么叫一个线程?

进程:做一个简单的解释-你的硬盘上有一个简单的程序-这个程序叫QQ.exe-这是一个程序-这个程序是一个静态的概念-它被扔在硬盘上也没人理他-但是当你双击它-弹出一个界面输入账号密码登录进去了-OK-这个时候叫做一个进程。进程相对于程序来说它是一个动态的概念
线程:作为一个进程里面最小的执行单元它就叫一个线程-用简单的话讲一个程序里不同的执行路径就叫做一个线程
#### 启动线程的五种方式
1: 继承Thread类 2: 实现Runnable 3: 线程池Executors.newCachedThrad
``java
package com.oi.juc.c_000;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.FutureTask;public class T02_HowToCreateThread { static class MyThread extends Thread { @Override public void run() { System.out.println("Hello MyThread!"); } } static class MyRun implements Runnable { @Override public void run() { System.out.println("Hello MyRun!"); } } static class MyCall implements Callable { @Override public String call() { System.out.println("Hello MyCall"); return "success"; } } //启动线程的5种方式 public static void main(String[] args) { // 继承Thread new MyThread().start(); // 实现Runable new Thread(new MyRun()).start(); // Lambda new Thread(()->{ System.out.println("Hello Lambda!"); }).start(); // 实现Callable Thread t = new Thread(new FutureTask(new MyCall())); t.start(); // 缓存线程池 ExecutorService service = Executors.newCachedThreadPool(); service.execute(()->{ System.out.println("Hello ThreadPool"); }); service.shutdown(); }}
`


#### 生命周期
wait(), join(), LockSupport() 进入waiting状态; notify(), notifyAll(), LockSupport
yield() Running –> Ready
等待过得同步代码块的锁, 进入Blocked状态, 获得后, 进入Runnale



#### 常用方法
`java
package com.oi.juc.c_000;public class T03_Sleep_Yield_Join { public static void main(String[] args) { //testSleep(); //testYield(); testJoin(); } /*Sleep,意思就是睡眠-当前线程暂停一段时间让给别的线程去运行。Sleep是怎么复活的?由你的睡眠时间而定-等睡眠到规定的时间自动复活*/ static void testSleep() { new Thread(()->{ for(int i=0; i<100; i++) { System.out.println("A" + i); try { Thread.sleep(500); //TimeUnit.Milliseconds.sleep(500) } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } /*Yield,就是当前线程正在执行的时候停止下来进入等待队列-回到等待队列里在系统的调度算法里头呢还是依然有可能把你刚回去的这个线程拿回来继续执行-当然-更大的可能性是把原来等待的那些拿出一个来执行-所以yield的意思是我让出一下CPU-后面你们能不能抢到那我不管*/ static void testYield() { new Thread(()->{ for(int i=0; i<100; i++) { System.out.println("A" + i); if(i%10 == 0) Thread.yield(); } }).start(); new Thread(()->{ for(int i=0; i<100; i++) { System.out.println("------------B" + i); if(i%10 == 0) Thread.yield(); } }).start(); } /*join- 意思就是在自己当前线程加入你调用Join的线程()-本线程等待。等调用的线程运行完了-自己再去执行。t1和t2两个线程-在t1的某个点上调用了t2.join,它会跑到t2去运行-t1等待t2运行完毕继续t1运行(自己join自己没有意义) */ static void testJoin() { Thread t1 = new Thread(()->{ for(int i=0; i<100; i++) { System.out.println("A" + i); try { Thread.sleep(500); //TimeUnit.Milliseconds.sleep(500) } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread t2 = new Thread(()->{ try { t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } for(int i=0; i<100; i++) { System.out.println("A" + i); try { Thread.sleep(500); //TimeUnit.Milliseconds.sleep(500) } catch (InterruptedException e) { e.printStackTrace(); } } }); t1.start(); t2.start(); }}
`