线程优先级问题

问题描述

package thread;import java.lang.Runnable;import java.math.*;import java.util.*;public class TestSort extends Thread{    int data[] = new int[10000];    String name;    public TestSort(String name)    {        super(name);        this.name = name;        setTheArray();    }    void setTheArray()    {        int i=0;        while(i<10000)        {            data[i++]=(int)Math.random();        }    }    public void swap(int []array,int i,int j)    {        int temp = array[i];        array[i] = array[j];        array[j] = temp;    }    public void selectionSort()    {        Calendar time1 = Calendar.getInstance();        int sec1 = time1.get(Calendar.MILLISECOND);        System.out.println("selectionSort");        for(int i = 0;i<data.length;i++)        {            int minIdex = i;            for( int j = i+1;j<data.length;j++)                if (data[j]<data[minIdex])                    minIdex =  j;            if(minIdex != i)                swap(data,minIdex,i);        }        Calendar time2 = Calendar.getInstance();        int sec2 = time2.get(Calendar.MILLISECOND);//        System.out.println("selectionSort used the millisec is"+(sec2-sec1));            }        public void bubbleSort()    {        Calendar time5 = Calendar.getInstance();        int sec5 = time5.get(Calendar.MILLISECOND);        System.out.println("bubbleSort");        for(int i = 0;i<data.length-1;i++)        {            boolean swapped = false;            for(int j = 0;j<data.length-i-1;j++)                if(data[j]>data[j+1])                {                    swap(data,j,j+1);                    swapped = true;                }            if(!swapped)                return;        }        Calendar time6 = Calendar.getInstance();        int sec6 = time6.get(Calendar.MILLISECOND);//        System.out.println("bubbleSortused the millisec is"+(sec6-sec5));            }    public void insertionSort()    {        Calendar time3 = Calendar.getInstance();        int sec3 = time3.get(Calendar.MILLISECOND);        System.out.println("insertionSort");        for(int i = 1;i<data.length;i++)        {            int itemToInsert = data[i];            int j = i-1;            while(j>=0)            {                if(itemToInsert<data[j])                {                    data[j+1] = data[j];                    j--;                }                else                    break;            }            data[j+1] = itemToInsert;        }        Calendar time4 = Calendar.getInstance();        int sec4 = time4.get(Calendar.MILLISECOND);//        System.out.println("insertionSort used the millisec is"+(sec4-sec3));    }    public void run()    {        synchronized (this.name) {        if(this.name.equals("selectionSort"))            selectionSort();        else if(this.name.equalsIgnoreCase("bubleSort"))            bubbleSort();        else if(this.name.equals("insertSort"))            insertionSort();        }    }        public static void  main(String args[])    {        TestSort p1 = new TestSort("selectionSort");        TestSort p2 = new TestSort("bubleSort");        TestSort p3 = new TestSort("insertSort");        p1.setPriority(Thread.MAX_PRIORITY);        p1.setPriority(Thread.NORM_PRIORITY);        p1.setPriority(Thread.MIN_PRIORITY);        p1.start();        p2.start();        p3.start();    }}   结果是随机调度线程???

解决方案

还一个问题,你的程序中 TestSort p1 = new TestSort("selectionSort"); TestSort p2 = new TestSort("bubleSort"); TestSort p3 = new TestSort("insertSort");也不会发生数据同步访问的可能性,你这里synchronized (this.name) { if(this.name.equals("selectionSort")) selectionSort(); else if(this.name.equalsIgnoreCase("bubleSort")) bubbleSort(); else if(this.name.equals("insertSort")) insertionSort(); }同步操作没什么意义。楼主还得多理解下线程使用的场景。
解决方案二:
线程调度器挑选一个新的线程时, 会优先考虑高优先级的线程,但在Java中,线程的实现机制依赖于底层的操作系统,这种设置 p1.setPriority(Thread.MAX_PRIORITY); p1.setPriority(Thread.NORM_PRIORITY); p1.setPriority(Thread.MIN_PRIORITY);可能在有些平台上就失效了,如果优先级相同,就进行随机调度线程了。所以程序的正确性是不应该建立在依赖线程的优先级的。还有这个 p1.setPriority(Thread.MAX_PRIORITY); p1.setPriority(Thread.NORM_PRIORITY); p1.setPriority(Thread.MIN_PRIORITY);三个p1在设置优先级,是啥意思?
解决方案三:
结果会是随机的调度线程,因为线程的优先级是在调用yeild让位方法的时候能体现出来,在调用start方法后线程就处于就绪状态,是可以参与竞争CPu 的,因此他们是随机调度的, 调用yeild方法则本线程会向比它优先级高或者跟他优先级相同的线程让位,但是本线程也是要参与竞争的这是我的个人见解,仅供参考

时间: 2024-12-08 13:47:32

线程优先级问题的相关文章

Java多线程:“基础篇”10之线程优先级和守护线程

1. 线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5."高优先级线程"会优先于 "低优先级线程"执行. java 中有两种线程:用户线程和守护线程.可以通过isDaemon()方法来区别它们:如果返回false, 则说明该线程是"用户线程":否则就是"守护线程". 用户线程一般用户执 行用户级任务,而守护线程也就是"后台线程",一般用来执行后台任务.需要注意的是: Java虚拟

[JAVA100例]067、线程优先级

import java.util.*; /** * <p>Title: 提高线程优先级</p> * <p>Description: 通过修改线程的优先级,是线程获得优先处理.</p> * <p>Copyright: Copyright (c) 2003</p> * <p>Filename: upPRIThread.java</p> * @version 1.0 */ public class upPRIThre

C++线程优先级SetThreadPriority的使用实例_C 语言

本文实例讲述了C++线程优先级SetThreadPriority的使用方法,分享给大家供大家参考.具体方法如下: 复制代码 代码如下: // ThreadPriority.cpp : 定义控制台应用程序的入口点.  //    #include "stdafx.h"  #include <Windows.h>    DWORD WINAPI ThreadProcIdle(LPVOID lpParameter)  {      for (int i=0;i<20;i++

《C#多线程编程实战(原书第2版)》——1.7 线程优先级

1.7 线程优先级 本节将描述线程优先级的几种不同的可能选项.线程优先级决定了该线程可占用多少CPU时间. 1.7.1 准备工作 为了学习本节,你需要安装Visual Studio 2015.除此之外无需其他准备.本节的源代码放置在BookSamplesChapter1Recipe6目录中. 1.7.2 实现方式 请执行以下步骤来了解线程优先级的工作方式: 1.启动Visual Studio 2015.新建一个C#控制台应用程序项目. 2.在Program.cs文件中加入以下using指令: 3

Android线程优先级设置方法技巧

对于Android平台上的线程优先级设置来说可以处理很多并发线程的阻塞问题, 比如很多无关紧要的线程会占用大量的CPU时间,虽然通过了MultiThread来解决慢速I/O但是合理分配优先级对于并发编程来说十分重要. Android在线程方面主要使用的是Java本身的Thread类,我们可以在Thread或Runnable接口中的run方法首句加入:Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);//设置线程优先级为后台

Java线程优先级示例代码_java

使用过Bit下载软件的同学应该很清楚,我们有多个下载任务同时执行,而其中的某一个或多个是非常重要的,于是给这些任务设定一个高度优先,以便任务可以获取更多的带宽尽早完成下载.Java线程的优先级也差不多,优先级越高排程器就会给它越多的CPU执行时间,但请注意:如果有多个线程在等待一个机锁的时候,并不是优先级越高就可以越早执行. 复制代码 代码如下: import java.awt.BorderLayout; import java.awt.event.ActionEvent; import jav

马士兵J2SE-第九章-多线程机制-sleep、join、yield、线程优先级

sleep: package com.zzk.test; import java.util.*; public class Test{ public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); try { Thread.sleep(10000);//10秒结束 } catch(InterruptedException e) { } thread.interrupt(); }

C# 多线程 线程内部是否改变本线程的优先级

问题描述 C#多线程,是否可以在某一线程内部改变本线程的优先级,使得该线程中某段代码执行的是否独占cpu?而不被其他线程抢占.或者有没有其他方法可以使得线程中某段代码执行的时候,独占CPU.谢谢! 解决方案 解决方案二:独占的意义是什么?如果其他线程依赖某个线程的运行结果,可以使用信号量来实现多线程同步解决方案三:引用楼主huazi113888的回复: C#多线程,是否可以在某一线程内部改变本线程的优先级,使得该线程中某段代码执行的是否独占cpu?而不被其他线程抢占.或者有没有其他方法可以使得线

请教高人:线程的优先级,Java1.6还是抢占式的吗?

问题描述 我随便写了以下的简单代码来测试不同优先级线程的执行情况:线程t1的优先级是9,高,线程t2的优先级是1,低.但是,实际上在1.6.0_23的SDK下运行结果,是两个线程都有执行,交互执行的方式.我记得以前最初时,这个程序执行的结果应该是只会执行t1,而t2从未获得执行机会的.不知道是不是我记错了?还是1.6版本修改了抢占式的线程执行机制呢?请高手指点一下,谢谢!publicclassThreadTestextendsThread{publicstaticvoidmain(String[