从头认识多线程-1.16 对照不同的优先级

这一章节我们来做一个測试,对照一下不同的优先级会形成如何的结果?

1.代码清单

package com.ray.deepintothread.ch01.topic_16;

import java.util.Random;

public class PrioritySample2 {
	public static void main(String[] args) throws InterruptedException {
		for (int i = 0; i < 5; i++) {
			ThreadThree ThreadThree = new ThreadThree();
			ThreadThree.setName("high priority");
			ThreadThree.setPriority(2);
			ThreadThree.start();
			ThreadFour ThreadFour = new ThreadFour();
			ThreadFour.setName("low priority");
			ThreadFour.setPriority(1);
			ThreadFour.start();
		}
		Thread.sleep(2000);
		System.out.println("--------------");
		for (int i = 0; i < 5; i++) {
			ThreadThree ThreadThree = new ThreadThree();
			ThreadThree.setName("high priority");
			ThreadThree.setPriority(3);
			ThreadThree.start();
			ThreadFour ThreadFour = new ThreadFour();
			ThreadFour.setName("low priority");
			ThreadFour.setPriority(2);
			ThreadFour.start();
		}
		Thread.sleep(2000);
		System.out.println("--------------");
		for (int i = 0; i < 5; i++) {
			ThreadThree ThreadThree = new ThreadThree();
			ThreadThree.setName("high priority");
			ThreadThree.setPriority(6);
			ThreadThree.start();
			ThreadFour ThreadFour = new ThreadFour();
			ThreadFour.setName("low priority");
			ThreadFour.setPriority(5);
			ThreadFour.start();
		}
		Thread.sleep(2000);
		System.out.println("--------------");
		for (int i = 0; i < 5; i++) {
			ThreadThree ThreadThree = new ThreadThree();
			ThreadThree.setName("high priority");
			ThreadThree.setPriority(8);
			ThreadThree.start();
			ThreadFour ThreadFour = new ThreadFour();
			ThreadFour.setName("low priority");
			ThreadFour.setPriority(7);
			ThreadFour.start();
		}
		Thread.sleep(2000);
		System.out.println("--------------");
		for (int i = 0; i < 5; i++) {
			ThreadThree ThreadThree = new ThreadThree();
			ThreadThree.setName("high priority");
			ThreadThree.setPriority(10);
			ThreadThree.start();
			ThreadFour ThreadFour = new ThreadFour();
			ThreadFour.setName("low priority");
			ThreadFour.setPriority(1);
			ThreadFour.start();
		}
	}
}

class ThreadThree extends Thread {

	@Override
	public void run() {
		long startTime = System.currentTimeMillis();
		for (int i = 0; i < 50000; i++) {
			Random random = new Random();
			random.nextInt(50);
		}
		long endTime = System.currentTimeMillis();
		System.out.println(Thread.currentThread().getName() + " " + (endTime - startTime));
	}
}

class ThreadFour extends Thread {

	@Override
	public void run() {
		long startTime = System.currentTimeMillis();
		for (int i = 0; i < 50000; i++) {
			Random random = new Random();
			random.nextInt(50);
		}
		long endTime = System.currentTimeMillis();
		System.out.println(Thread.currentThread().getName() + " " + (endTime - startTime));
	}
}

输出:

high priority 468
high priority 484
low priority 406
low priority 656
low priority 609
low priority 750
low priority 656
high priority 515
high priority 813
high priority 547
--------------
high priority 438
high priority 453
high priority 484
high priority 515
high priority 438
low priority 578
low priority 484
low priority 703
low priority 610
low priority 641
--------------
low priority 375
high priority 531
low priority 578
low priority 594
high priority 593
low priority 703
high priority 687
low priority 468
high priority 750
high priority 672
--------------
low priority 343
high priority 360
low priority 343
high priority 562
high priority 390
low priority 250
high priority 485
low priority 500
high priority 234
low priority 234
--------------
high priority 140
high priority 297
high priority 156
high priority 188
high priority 109
low priority 406
low priority 468
low priority 484
low priority 359
low priority 500

从第二组输出看出。跟最后一组同样,临时不知道为什么,有待以后解决

从第三组输出我们能够观察到,不一定是优先级高的就能够先完毕

从最后一组的输出我们能够看到。巨大的优先级差距带来的是运行顺序的不一样

总结:这一章节我们主要对照一下不同优先级运行程序的效果是如何的

我的github:https://github.com/raylee2015/DeepIntoThread

时间: 2024-12-15 01:51:55

从头认识多线程-1.16 对照不同的优先级的相关文章

从头认识多线程-2.16 同步静态方法和静态代码块

这一章节我们来讨论一些同步静态方法和静态代码块. 代码清单 package com.ray.deepintothread.ch02.topic_17; /** * * @author RayLee * */ public class SynchClass { public static void main(String[] args) throws InterruptedException { ThreadOne threadOne = new ThreadOne(); Thread threa

从头认识多线程-2.8 缓解同步方法的隐患-同步代码块

这一章节我们来讨论一下缓解同步方法的隐患-同步代码块. 1.思路:把同步方法,降低同步的粒度,同步到代码块 2.根据上一章节的例子,我们把代码修改一下 (1)第一种方法,把同步标记移到更新的那一栏里面去,一般来说大部分都是更新的时候需要同步数据 package com.ray.deepintothread.ch02.topic_9; /** * 从头认识多线程-2.8 缓解同步方法的隐患-同步代码块<br> * * @author RayLee * */ public class Relief

从头认识多线程-2.14 解决由同步的synchronized (newobject()) 引起的脏读的方法

这一章节我们来讨论一下解决由同步的synchronized (newobject()) 引起的脏读的方法. 1.造成上面脏读的原因:多线程多方法同时访问并修改某个属性域 2.解决思路 顺着上面的原因,笔者提出两种不是方法的方法 (1)只能单线程单方法访问并修改某个属性域这样就保证了执行的顺序(也就是需要同步所有访问并修改的步骤)(缺点:性能低下,优点:数据的强一致性) (2)在多线程多方法的情况下,只能够访问多个属性域,不能够同时访问并修改某一个单一的属性域(根本目的就是分开运算,但是,在生产环

从头认识java-14.1 再次对照数组与容器

这一章节我们再次深入的对照数组与容器. 数组与容器主要集中在三个方面:效率.类型.基础类型. 我们能够从三方面做出对照. 1.效率 这里的下来是指add和get 的速度 以下以add为例: package com.ray.ch13; import java.util.ArrayList; public class Test { public static void main(String[] args) { Integer zero = new Integer(0); ArrayList<Int

从头认识多线程-2.24 修改监视器对同步的影响

这一章节我们来讨论一下修改监视器对同步的影响. 1.不修改监视器,同步的 package com.ray.deepintothread.ch02.topic_24; /** * * @author RayLee * */ public class SynchOfStaticInnerClass { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { public void run

从头认识多线程-4.1 对象的发布(Publish)、逸出(Escape)以及逸出的解决方案

这一章节我们来讨论一下对象的发布与逸出. 其实在前两个章节我们都有想应的讨论,只不过有一些不用补充的问题,我将会放到这个章节里面去. 1.发布(Publish) 当一个对象能够给其他代码引用. package com.ray.deepintothread.ch04.topic_1; import java.util.HashMap; public class Publish { private HashMap<String, Object> map = null; public HashMap

从头认识多线程-2.15 证明使用属性域作为多线程监视器是不同步的

这一章节接着上一章节最后的错误的思路,我们来证明使用整数属性域作为多线程监视器是不同步的. 1.用同一个属性域作为多线程监视器,是不同步的 package com.ray.deepintothread.ch02.topic_16; /** * * @author RayLee * */ public class DirtyReadWithSynchBlock { public static void main(String[] args) throws InterruptedException

从头认识多线程-2.2 synchronized持有对象锁与类锁的相同点

这一章节我们来讨论一下synchronized持有对象锁与类锁的相同点. 1.当所有方法都不使用同步的时候 代码清单 package com.ray.deepintothread.ch02.topic_2; public class SynchInstance1 { public static void main(String[] args) throws InterruptedException { MyTestObjectOne myTestObjectOne = new MyTestObj

从头认识多线程-4.3 ThreadLocal使用时需要注意的地方

4.3 这一章节我们来讨论一下关于ThreadLocal的使用的时候需要注意的地方 ThreadLocal主要的使用是get.set.initialValue这几个方法,具体的使用我们这里不做介绍,下面只是举一些它使用的时候需要注意的地方. 1.在get方法的时候出现null package com.ray.deepintothread.ch04.topic_3; public class ThreadLocalGetNull { private int count = 0; public Th