浙江建设职业继续教育学院网站,动态ip建网站,玉林市网站开发公司电话,洛阳市宜阳建设局网站大家好#xff0c;通过java进阶—多线程#xff0c;我们知道的什么是进程#xff0c;什么是线程#xff0c;以及线程的三种创建方式的选择
今天#xff0c;我们来看看线程的基础操作
start() 开启线程
public class Demo implements Runnable {Overridepublic void run…大家好通过java进阶—多线程我们知道的什么是进程什么是线程以及线程的三种创建方式的选择
今天我们来看看线程的基础操作
start() 开启线程
public class Demo implements Runnable {Overridepublic void run() {for (int i 0; i 3; i) {System.out.println(线程开启我就跑);}}public static void main(String[] args) {Demo demo new Demo();Thread thread new Thread(demo);//开启线程 thread.start();}
}currentThread() 返回当前线程
currentThread() 获取了当前线程里面可以获取当前线程的名字 1. getName(): 获取当前线程名字2. getId(): 获取当前线程名字public class Demo implements Runnable{Overridepublic void run() {System.out.println(当前线程 Thread.currentThread());System.out.println(当前线程的名字 Thread.currentThread().getName());System.out.println(当前线程的Id Thread.currentThread().getId());}public static void main(String[] args) {Demo demo new Demo();Thread thread new Thread(demo);thread.start();}
}为什么是 默认是 Thread-0 是因为 Thread类里面的一个空参构造函数 调用 nextThreadNum() 参数是从0 开始自增的
setName() 设置线程的名字 觉得默认的 thread-0 名字不好没关系我们可以自己设置 名字 public class Demo implements Runnable{Overridepublic void run() {System.out.println(当前线程 Thread.currentThread());System.out.println(当前线程的名字 Thread.currentThread().getName());}public static void main(String[] args) {Demo demo new Demo();Thread thread new Thread(demo);thread.setName(我设置的线程名字);thread.start();}
} yield() 线程让步释放当前CPU的执行
来看一个例子主线程mian同 thread-0 线程 同时去执行 循环去抢Cpu的执行权我们在thread-0 线程加上 如果 循环出的值 %2 0 是偶数它就释放执行权 public class Demo implements Runnable {Overridepublic void run() {for (int i 0; i 50; i) {System.out.println(Thread.currentThread().getName() : i);if (i % 2 0) {Thread.yield();}}}public static void main(String[] args) {Demo demo new Demo();Thread thread new Thread(demo);thread.start();for (int i 0; i 50; i) {System.out.println(Thread.currentThread().getName() : i);}}
}当然释放执行权并不是一定也是有概率的有可能下一个执行权还是 thread-0
join() 让当前线程进入阻塞状态被join线程执行完再执行
举个例子比如还是前面 thread-0 跟 主线程 抢占cpu执行权现在我们在主线程中加一个 限制 条件当主线程 循环到 10 时让主线程进入阻塞状态thread-0优先执行完主线程再开始执行
public class Demo implements Runnable {Overridepublic void run() {for (int i 0; i 50; i) {System.out.println(Thread.currentThread().getName() : i);if (i % 2 0) {Thread.yield();}}}public static void main(String[] args) {Demo demo new Demo();Thread thread new Thread(demo);thread.start();for (int i 0; i 50; i) {System.out.println(Thread.currentThread().getName() : i);if(i10) {try {thread.join();} catch (InterruptedException e) {e.printStackTrace();}}}}
}通过 thread-0线程去调用join方法 让 thread-0优先执行 可以看到 mian到了 10 时就停止了等thread-0 执行完再开始 stop 强制结束当前线程方法已经过时不建议使用 开发中不要用 sleep毫秒值让当前线程进入休眠时间时间结束继续执行 public class Demo implements Runnable {Overridepublic void run() {for (int i 0; i 50; i) {System.out.println(Thread.currentThread().getName() : i);if (i %20) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {Demo demo new Demo();Thread thread new Thread(demo);thread.start();for (int i 0; i 50; i) {try {thread.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() : i);}}
}当阻塞时间结束也并不是直接执行也得dengCPU分配给你。你再执行在阻塞时间内cpu 想分配资源给你都不行
isAlive() 判断线程是否终止这个线程是不是还活着
public class Demo implements Runnable {Overridepublic void run() {for (int i 0; i 50; i) {System.out.println(Thread.currentThread().getName() : i);if (i %20) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {Demo demo new Demo();Thread thread new Thread(demo);thread.start();for (int i 0; i 50; i) {try {thread.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() : i);}System.out.println(线程是否还存活thread.isAlive());}
}执行结果 解析看的懂得小伙伴可以略过 我们在主线程中直接加了 join, 所以得等主线程执行完成再执行主线程由于我们是在主线程之后加的判断线程 thread-0是否存活这时候 thread-0 已经执行完任务了生命周期结束所以此时的thread-0 已经终止了
以上便是线程最常用方法了