java----线程
线程:
知识点:
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。Thread.sleep() 线程睡眠 ,需要try,但是不释放锁
this.wait() 线程进入等待状态(需要notify来唤醒该线程),释放锁 ,this.notify() 换醒线程,利用他可以做线程之间的切换转换 注意:wait需要在同步方法中使用
Thread.yield() 让出本次CPU执行时间片,通常用来 协程 使用
线程.join() 等待线程结束
基本操作
public class Demo { public static void main(String[] args) { //使用类的继承方法 MyThread1 mt = new MyThread1(); mt.start(); //表示线程处于就绪状态,等待cpu的调用 //使用接口的方式,推荐使用 //将Mythread2这个任务放到Thread这个线程中完成 Thread t = new Thread(new Mythread2()); t.start(); } } class MyThread1 extends Thread{ public void run(){ for (int i = 0; i <100 ; i++) { System.out.println(i+"->"+Thread.currentThread().getName()); } } } class Mythread2 implements Runnable{ public void run() { for (int i = 0; i <100 ; i++) { System.out.println(i+"->"+Thread.currentThread().getName()); } } }
线程终断
方式1:
public class Demo { public static void main(String[] args) { Thread t = new Thread(new Mythread2()); t.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } t.interrupt(); //表示给当前的线程打上中断标记,不能真正的中断线程; } } class Mythread2 implements Runnable{ public void run() { for (int i = 0; i <10 ; i++) { if(Thread.interrupted()){//如果线程存在中断标记; break; //return; } try { sleep(500); } catch (InterruptedException e) {//任何线程中断中断当前线程;抛出异常,当前线程的中断状态被清除; e.printStackTrace(); Thread.currentThread().interrupt();//给线程在打上中断标记 } System.out.println(i+"->"+Thread.currentThread().getName()); } System.out.println("线程已经终止"); } }
方式2:使用自定义的标记(推荐)
public class Demo { public static void main(String[] args) { Mythread2 th = new Mythread2(); Thread t = new Thread(th); t.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } th.flag=false; //自定义中断标记 } } class Mythread2 implements Runnable{ public boolean flag = true; public void run() { for (int i = 0; i <10 ; i++) { if(flag==false){ //return; break; } try { sleep(500); } catch (InterruptedException e) {//任何线程中断中断当前线程;抛出异常,当前线程的中断状态被清除; e.printStackTrace(); } System.out.println(i+"->"+Thread.currentThread().getName()); } System.out.println("线程已经终止"); } }
守护线程
线程:分为用户线程和守护线程;
JVM 只关心用户线程,默认所有的设置的线程都是用户线程,当用户线程执行完毕之后,JVM就会退出,如果把一个线程设置为守护线程,那么JVM不在关心这个线程是否执行完毕了
public class Demo { public static void main(String[] args) { Mythread2 th = new Mythread2(); Thread t = new Thread(th); t.setDaemon(true);//把线程设置为守护线程 t.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("主线程退出;"); } } class Mythread2 implements Runnable{ public void run() { for (int i = 0; i <10 ; i++) { try { sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i+"->"+Thread.currentThread().getName()); } } }
线程同步
方式一: 使用 synchronized 将数据包裹起来; (同步代码块)
public class Demo { public static void main(String[] args) { Mythread2 th = new Mythread2(); for (int i = 0; i <2 ; i++) { new Thread(th).start(); } } } class Mythread2 implements Runnable{ public int ticket=10; private Object obj = new Object(); public void run() { while(true){ synchronized (obj){ //直接写synchronized(this)也可以,没有实际意义 if(ticket>0){ ticket--; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("还有"+ticket+"张票"+"->"+Thread.currentThread().getName()); }else{ break; } } } } }
方法二:使用同步方法:同步的对象是当前的对象(this)
注意事项:如果在同步方法内部又调用了该对象的另一个同步方法,就会发生死锁,同步方法本质 synchronized(this);
public class Demo { public static void main(String[] args) { Mythread2 th = new Mythread2(); for (int i = 0; i < 2; i++) { new Thread(th).start(); } } } class Mythread2 implements Runnable { public int ticket = 10; private Boolean flag=true; public void run() { while (flag) { method(); } } //同步方法 private synchronized void method() { ticket--; if (ticket>=0){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("还有" + ticket + "张票" + "->" + Thread.currentThread().getName()); }else { flag=false; } } }
方法三:使用lock() 更加灵活
import java.util.concurrent.locks.ReentrantLock; public class Demo { public static void main(String[] args) { Mythread2 th = new Mythread2(); for (int i = 0; i < 2; i++) { new Thread(th).start(); } } } class Mythread2 implements Runnable { public int ticket = 10; private Boolean flag=true; ReentrantLock lock = new ReentrantLock(); public void run() { while (flag) { lock.lock(); try{ ticket--; if (ticket>=0){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("还有" + ticket + "张票" + "->" + Thread.currentThread().getName()); }else { flag=false; } }finally {//避免死锁 lock.unlock(); } } } }
生产者消费者模型
public class Demo { public static void main(String[] args) { Food food = new Food(); new Thread(new Chef(food)).start(); new Thread(new Customer(food)).start(); } } class Chef implements Runnable{ private Food food; public Chef(Food food){ this.food = food; } public void setfood(){ this.food.setfood(); } @Override public void run() { setfood(); } } class Customer implements Runnable{ private Food food; public Customer(Food food){ this.food = food; } public void getfood(){ this.food.getfood(); } @Override public void run() { getfood(); } } class Food{ private String name; private Boolean flag = true; public synchronized void setfood(){ for (int i = 0; i <10 ; i++) { if (!flag){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("包子"+i+"制作完毕"); this.name = "包子"+i; flag = false; this.notify(); } } public synchronized void getfood(){ for (int i = 0; i < 10; i++) { if (flag){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.name+"已经吃完"); flag=true; this.notify(); } } }
线程池
public class Demo { public static void main(String[] args) { //创建一个单线程的线程池 //ExecutorService es1 = Executors.newSingleThreadExecutor(); //es1.execute(new Test()); //完成任务之后,线程不会结束; //es1.execute(new Test()); //es1.shutdown(); //结束线程池; //创建一个固定的大小的线程池 //ExecutorService es2 = Executors.newFixedThreadPool(4); //es2.execute(new Test()); //完成任务之后,线程不会结束; //es2.execute(new Test()); //线程池的大小依赖操作系统;并且操作系统会自动对不工作的线程进行回收 //ExecutorService es3 = Executors.newCachedThreadPool(); //任务延迟3秒后执行 ScheduledExecutorService es4 = Executors.newScheduledThreadPool(3); es4.schedule(new Test(),3000, TimeUnit.MILLISECONDS); } } class Test implements Runnable{ @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(i+"->"+Thread.currentThread().getName()); } } }

更多精彩