何以解忧
public class Example1 {
static class TmpThread implements Runnable{
@Override
public void run() {
while (true) {
try {
// 让这个线程睡眠 1s
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("TmpThread -> 线程正在运行...");
}
}
}
public static void main(String[] args) {
new Thread(new TmpThread()).start();
System.out.println("主线程运行结束...");
}
}
这个例子的运行结果可能出乎的意料, 如果你在此之前没有接触过线程概念的话;
主线程运行结束...
TmpThread -> 线程正在运行...
TmpThread -> 线程正在运行...
TmpThread -> 线程正在运行...
TmpThread -> 线程正在运行...
在 main(String[] args) 方法运行完后, TmpThread#run() 方法依然在运行. 直到你手动终止这个 Java 程序. 这就是线程, 能单独的运行.
他的运行逻辑如下, 因为死循环, 所以程序不会终止.
start
|
|
main() 被执行
|------- 创建了一个线程 ---------|
| TmpThread#run() 被执行, 死循环打印
end
class TmpThread2 extends Thread {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("TmpThread -> 线程正在运行...");
}
}
}
// 运行这个线程只需要用对象执行 start() 方法就行
new TmpThread2().start();
class TmpThread implements Runnable{
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("TmpThread -> 线程正在运行...");
}
}
}
// 运行这个线程需要用实现的对象创建 Thread 实例
new Thread(new TmpThread()).start();
给线程起个名字
new Thread(tmpThread, "后台线程");
在创建是直接赋值thread.setName();
设置名字Thread.currentThread().getName()
假如想在主线程结束的时候, 其他线程也结束怎么办?
class TmpThread implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 获取当前执行的线程的名字
System.out.println(Thread.currentThread().getName() + "-> 线程正在运行...");
}
}
}
public static void main(String[] args) throws InterruptedException {
TmpThread tmpThread = new TmpThread();
Thread thread = new Thread(tmpThread, "后台线程"); // 将线程设置名字
thread.setDaemon(true);
thread.start();
System.out.println("此线程是后台线程吗?" + thread.isDaemon());
Thread.sleep(5000); // 让主线程睡 5s, 防止直接执行结束看不到子线程的执行
System.out.println("主线程运行结束...");
}
可以看到线程执行了一会之后, 就程序结束了.
此线程是后台线程吗? true
TmpThread -> 线程正在运行...
TmpThread -> 线程正在运行...
TmpThread -> 线程正在运行...
TmpThread -> 线程正在运行...
主线程运行结束...
在 Java 程序里面除了执行 main 方法的前台线程以外, 还有 gc 后台线程等.
线程的生命周期
线程的优先级
Thread minPriority = new Thread(new Thread1(), "高优先级");
Thread maxPriority = new Thread(new Thread2(), "低优先级");
minPriority.setPriotity(Thread.MIN_PRIORITY);
maxPriority.setPriotity(10);
// 当高优先级的运行完之后, 低优先级才运行
// 值得注意的是, 这种方式并不是很靠谱, 有些 OS 并不太支持
Thread.sleep(1000); // 毫秒值
, 当前运行的线程休眠yield()
让 cpu 重新选择一次执行的线程join()
thread1.joio()
将当前线程加入到 thread1 之后, 等 thread1 执行完之后, 才执行此线程/**
* 强吧, 常数级别的时间复杂度, hhh
*/
public class SleepSort {
private int[] arr = new int[]{9, 200, 1, 2, 10, 10, 56, 23, 9537};
private void doSort() {
for (int i = 0; i < arr.length; i++) {
int finalI = i;
new Thread(() -> {
try {
Thread.sleep(arr[finalI]);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(arr[finalI] + ", ");
}).start();
}
}
public static void main(String[] args) {
new SleepSort().doSort();
}
}