1.線程簡介
1.1什麼是線程
現代操作系統調度的最小單元是線程,也是輕量級線程,在一個進程中可以創建多個線程(而一個線程在一個時刻只能運行在一個處理器的核心上),這些線程都擁有各種的計數器、堆棧和局部變量等屬性,並且可以訪問共享的內存變量。處理器在這些線程上高速切換 ,讓使用者感覺這些線程是同步在執行的
。
使用jmx查看一個java線程包含哪些線程
package cn.smallmartial.concurrency;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
/**
* @Author smallmartial
* @Date 2019/8/22
* @Email [email protected]
*/
public class MultiThread {
public static void main(String[] args) {
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
for (ThreadInfo threadInfo : threadInfos) {
System.out.println(threadInfo.getThreadId()+":"+threadInfo.getThreadName());
}
}
}
一個java程序的運行不僅僅是main()方法的運行,而是main線程和其他多個線程在同時執行。
1.2爲什麼使用多線程
- 更多的處理器核心
- 更快的響應時間
- 更好的編程模型
1.3線程的優先級
現在操作系統採用時分的形式調度運行的線程,操作系統會分出一個個時間片,線程會被分配若干個時間片,當時間片用完則發生線程調度,並等着下次分配。
-
在java中通過變量
priority
來控制優先級,優先級默認範圍1~10,通過setProiority
方法來修改優先級,默認優先級是5。package cn.smallmartial.concurrency; import java.util.ArrayList; import java.util.concurrent.TimeUnit; /** * @Author smallmartial * @Date 2019/8/22 * @Email [email protected] */ public class Priority { private static volatile boolean notStart = true; private static volatile boolean notEnd = true; public static void main(String[] args) throws Exception{ ArrayList<Job> jobs = new ArrayList<Job>(); for (int i = 0; i < 10; i++) { int priority = i < 5 ? Thread.MIN_PRIORITY : Thread.MAX_PRIORITY; Job job = new Job(priority); jobs.add(job); Thread thread = new Thread(job, "Thread:" + i); thread.setPriority(priority); thread.start(); } notStart = false; TimeUnit.SECONDS.sleep(10); notEnd = false; for (Job job : jobs) { System.out.println("Job Priority:"+job.priority+"Count : "+job.jobCount); } } private static class Job implements Runnable { private int priority; private long jobCount; public Job(int priority) { this.priority = priority; } @Override public void run() { while (notStart){ Thread.yield();//yield, sleep 都能暫停當前線程,sleep 可以指定具體休眠的時間,而 yield 則依賴 CPU 的時間片劃分 } while (notEnd){ Thread.yield(); jobCount++; } } } }
運行結果:
(個別系統,不依賴於線程的優先級--java併發編程藝術)