线程之间的执行时相互独立的,哪一个线程优先执行取决于os的调度
线程的创建方式:3种
实现Runnable接口、继承Thread类、实现Callable接口
实现runnable接口
1、创建自定义类并实现runnable接口,并实现接口中的run方法
2、实例化自定义的类
3、将自定义类的实例作为参数给Thread类,创建thread实例
4、调用thread实例的start方法,启动子线程
RunnableThreadGY03 threadGY03 = new RunnableThreadGY03();
Thread thread = new Thread(threadGY03);
thread.start();
继承Thread类方式创建新线
1、创建自定义的类继承Thread类,并且重写run接
2、实例化自定义
3、通过实例化对象调用start方法来创建新线
ExtendThreadGY03 extendThreadGY03 = new ExtendThreadGY03();
extendThreadGY03.start();
实现Callable接口
callable接口的实现他是线程迟提供的一种创建线程的方式
1、实现Callable接口,并且实现call方法
2、创建线程池(Executors工具类提供的方法创建线程池)
3、创建Callable接口实现类的实例
4、将实例对象通过线程池的submit方法提交给线程池进而创建新的线程
ExecutorService executor = Executors.newSingleThreadExecutor();
CallableThreadGY03 callableThreadGY03 = new CallableThreadGY03();
executor.submit(callableThreadGY03);
线程操作的相关方法介绍:
void start(): 启动一个新的线程,start方法必须子线程第一个调用的方法,start不能够重复使用,新线程会调用runnable接口提供的run方法;
public void run():run方法是子线程的执行体,子线程从进入run方法开始直到run方法执行接受意味着子线程的任务执行接收,在主线程直接调用run方法是不能创建子程序,只是普通方法调用;
public static void yield():让步或暂停:Thread类的静态方法,让正在执行的线程停止或者让步,让给优先级较高的线程获取CPU的执行权,(不一定会让出CPU执行权,例如等的线程优先级较低或者当前只有一个线程在执行时,那么当先线程又会立即获取CPU的执行权)
thread.yield() thread线程 != 正在执行的线程
public static void sleep(long millis) throw InterruptedException;
sleep(long millis)
sleep方法作用是让线程进行休眠,即让线程阻塞住,Thread类提供的静态方法,会抛出 InterruptedException异常
join():等待线程执行结束才继续执行,会抛出 InterruptedException异常 假如在a线程中b线程进行b.join调用,a线程等待b线程执行结束后才能继续执行,控制多线程按照次序执行
interrupt() 中断方法:底层调用native方法,native方法的作用是对特定标识位做修改;
主要作用于线程:运行中线程、阻塞线程(sleep、join);
运行中的线程:interrupt方法仅仅是对标志位做了修改,其他没有影响;
阻塞线程:interrupt方法对标志位做了修改,令阻塞中的线程感知到标志位做了修改,就会中断当前的阻塞状态,抛出InterruptedException异常;
isInterrupted:判断是否发生了中断操作,返回为boolean类型
true:表示发生了中断 false:表示未发生中断
setDaemon(boolean on):设置守护线程,true:设置为守护线程 false:用户线程
默认就是用户线程
isDeamon():判断当前线程是否为守护线程,返回boolean类型
true:守护线程 false:非守护线程
守护线程:脱离于空中终端,作为提供通用服务的线程存在,守护线程不会独自存在用户线程:
1、生命周期:守护线程的生命周期是依赖于用户线程,当有用户线程存在,守护线程就会存活,当没有用户线程存在,那守护线程也随之消亡,垃圾回收是有单独线程来处理的,负责垃圾回收的线程就是守护线程
setPriority(int newPriority)设置线程优先级,优先级分为10级,优先级数字越大,即优先级越高,优先级越高,被优先调用的概率会大
MIN_PRIORITY = 1; 最小优先级
NORM_PRIORITY = 5; 默认优先级
MAX_PRIORITY = 10; 最大优先级
int getPriority(),返回当前程序的优先级
练习题
假设有A.B.C三个线程,按照C.B.A的顺序执行???
public class TestThread0330 extends Thread{
private Thread thread;
public TestThread0330(Thread thread) {
this.thread = thread;
}
public TestThread0330() {
this.thread = null;
}
@Override
public void run() {
if (thread != null) {
try {
this.thread.join(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+" running");
}
}
public static void test() {
//假如有3个线程t1,t2,t3,将线程按照t3,t2,t1顺序执行
TestThread0330 TC = new TestThread0330();
TC.setName("C");
TestThread0330 TB = new TestThread0330(TC);
TB.setName("B");
TestThread0330 TA = new TestThread0330(TB);
TA.setName("A");
TA.start();
TB.start();
TC.start();
}
public static void main(String[] args) {
test();
}