java中的线程应用
线程的定义
cpu调度的最小单位,一个过程往往由一个或多个线程组成,线程中的通信容易同步简单,线程解体可能会影响整个程序的稳定性,可靠性低。
java中创立线程的形式
继承Thread
案例:
public class Demo01 { //继承Thread类 public static class MyThread extends Thread{ //重写run办法 @Override public void run() { System.out.println("MyThread"); } } public static void main(String[] args) { //实现 Thread th=new MyThread(); //启动 th.start(); } }
启动过程:创建对象后,线程变成新建态,当调用start办法线程进入就绪态,取得cpu使用权运行后,线程进入运行态,执行实现后线程死亡。
异样剖析:反复调用start则会抛出异样
实现Runnable接口
JDK源码:
@FunctionalInterfacepublic interface Runnable { public abstract void run();}
案例:
public class Demo02 { //实现Runnable接口 public static class MyThread implements Runnable{ //实现run办法 @Override public void run() { // TODO Auto-generated method stub System.out.println("MyThread"); } } public static void main(String[] args) { // TODO Auto-generated method stub Thread th=new Thread(new MyThread()); th.start(); } }
Thread源码剖析
JDK源码:
// Thread类源码// ⽚段1 - init⽅法private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc,boolean inheritThreadLocals)// ⽚段2 - 构造函数调⽤init⽅法public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0);}// ⽚段3 - 使⽤在init⽅法⾥初始化AccessControlContext类型的公有属性this.inheritedAccessControlContext = acc != null ? acc : AccessController.getContext(); // ⽚段4 - 两个对⽤于⽀持ThreadLocal的公有属性ThreadLocal.ThreadLocalMap threadLocals = null;ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
init办法中参数剖析:
ThreadGroup g:线程组,指定改线程归属于哪个线程组
Runnable target:执行的工作
String name:线程名
acc:⽤于初始化公有变量 inheritedAccessControlContext。
inheritThreadLocals:可继承的ThreadLocal
罕用构造方法
//创立一个线程,参数能够是一个实现Runnable接口的类Thread(Runnable target)//创立一个指定线程名的线程Thread(Runnable target,String name)
Thread的罕用办法
currentThread():动态⽅法,返回对以后正在执⾏的线程对象的引⽤。
start():开始执行线程的办法,java虚拟机调用线程中的run办法。
sleep:静态方法,让线程睡眠,工夫单位是毫秒,不会放弃对象锁。
yield:中文意思放弃,会让线程放弃cpu使用权,从运行态转换为就绪态,这⾥须要留神的是,就算以后线程调⽤了yield()
⽅法,程序在调度的时候,也还有可能持续运⾏这个线程的。
join:使以后线程期待指定线程执行完结之后执行,外部调用Object的wait办法实现。
Thread类与Runnable接口的比拟
Runnable属于接口,应用起来比Thread更加灵便。
Runnable更加合乎面向对象,将线程进行独自的封装。
Runnable接口升高了线程对象和线程工作的耦合性。
Runnable没有Thread那么多的办法,更为轻量。
在应用时Runnable接口的优先级更高。