欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java并发编程基础知识回顾(一)

程序员文章站 2024-03-19 22:49:04
...

为什么要使用多线程

  1. 更多的处理器核心
  2. 更快的响应时间
  3. 更好的编程模型

Java为多线程编程提供了良好、考究并且一致的编程模型,使开发人员能够更加专注于问 题的解决,即为所遇到的问题建立合适的模型,而不是绞尽脑汁地考虑如何将其多线程化。一 旦开发人员建立好了模型,稍做修改总是能够方便地映射到Java提供的多线程编程模型上

线程优先级

在Java线程中,通过一个整型成员变量priority来控制优先级,优先级的范围从1~10,在线 程构建的时候可以通过setPriority(int)方法来修改优先级,默认优先级是5,优先级高的线程分 配时间片的数量要多于优先级低的线程。设置线程优先级时,针对频繁阻塞(休眠或者I/O操 作)的线程需要设置较高优先级,而偏重计算(需要较多CPU时间或者偏运算)的线程则设置较 低的优先级,确保处理器不会被独占。在不同的JVM以及操作系统上,线程规划会存在差异, 有些操作系统甚至会忽略对线程优先级的设定

public class Priority {
	private static volatile boolean notStart = true;
	private static volatile boolean notEnd = true;

	public static void main(String[] args) throws Exception { 
		List<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); 
		} 
	}
	static class Job implements Runnable {
		private int priority;
		private long jobCount;

		public Job(int priority) {
			this.priority = priority;
		}

		public void run() {
			while (notStart) {
				Thread.yield();
			}
			while (notEnd) {
				Thread.yield();
				jobCount++;
			}
		}
	}
}

运行结果

Java并发编程基础知识回顾(一)

从输出可以看到线程优先级没有生效,优先级1和优先级10的Job计数的结果非常相近, 没有明显差距。这表示程序正确性不能依赖线程的优先级高低。

注意:线程优先级不能作为程序正确性的依赖,因为操作系统可以完全不用理会Java 线程对于优先级的设定。

相关标签: 并发编程