java线程学习记录(一)

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则会抛出异常
java线程学习记录(一)_第1张图片

实现Runnable接口

JDK源码

@FunctionalInterface
public 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接口的优先级更高。

你可能感兴趣的:(java,线程)