1.线程的优先级
每一个java线程都有一个优先级,这样有助于操作系统确定线程的调度顺序。
java线程的优先级是一个整数,其取值范围是1-10。
默认情况下每个线程的优先级为5。
具有较高优先级的线程对程序更重要,并且应该在低优先级的线程之前分配处理器资源。但是,线程优先级不能保证线程执行的顺序,而且非常依赖于平台。
public class Runabled implements Runnable { @Override public void run() { for(int i=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+":"+i); } } }@Test public void runnableTest(){ Thread t1=new Thread(new Runabled(),"thread1"); Thread t2=new Thread(new Runabled(),"thread2"); t1.setPriority(1); t2.setPriority(10); t1.start(); t2.start(); }
执行结果如下
thread2:0
thread2:1
thread2:2
thread2:3
thread2:4
thread2:5
thread2:6
thread2:7
thread2:8
thread1:0
thread2:9
thread1:1
thread1:2
thread1:3
thread1:4
thread1:5
thread1:6
thread1:7
thread1:8
thread1:9
2.Thread方法
序号 | 方法描述 |
---|---|
1 | public void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 |
2 | public void run() 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。 |
3 | public final void setName(String name) 改变线程名称,使之与参数 name 相同。 |
4 | public final void setPriority(int priority) 更改线程的优先级。 |
5 | public final void setDaemon(boolean on) 将该线程标记为守护线程或用户线程。 |
6 | public final void join(long millisec) 等待该线程终止的时间最长为 millis 毫秒。 |
7 | public void interrupt() 中断线程。 |
8 | public final boolean isAlive() 测试线程是否处于活动状态。 |
测试线程是否处于活动状态。 上述方法是被Thread对象调用的。下面的方法是Thread类的静态方法。
序号 | 方法描述 |
---|---|
1 | public static void yield() 暂停当前正在执行的线程对象,并执行其他线程。 |
2 | public static void sleep(long millisec) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。 |
3 | public static boolean holdsLock(Object x) 当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。 |
4 | public static Thread currentThread() 返回对当前正在执行的线程对象的引用。 |
5 | public static void dumpStack() 将当前线程的堆栈跟踪打印至标准错误流。 |
2.1sleep,join,yield方法介绍
sleep方法:让线程休眠,Thread类的静态方法。
public class Sleep {
public static void main(String args[])throws Exception{
MyThead myThead=new MyThead();
myThead.start();
myThead.sleep(10000);
myThead.flag=false;
}
}
class MyThead extends Thread{
boolean flag=true;
@Override
public void run() {
while (flag){
System.out.println("==================="+new Date().toLocaleString()+"===================");
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 执行结果
===================2019-2-15 13:23:24===================
===================2019-2-15 13:23:25===================
===================2019-2-15 13:23:26===================
===================2019-2-15 13:23:27===================
===================2019-2-15 13:23:28===================
===================2019-2-15 13:23:29===================
===================2019-2-15 13:23:30===================
===================2019-2-15 13:23:31===================
===================2019-2-15 13:23:32===================
===================2019-2-15 13:23:33===================
join方法:调用join方法合并线程,使得线程之间的并行执行变成串行执行
public class Sleep {
public static void main(String args[])throws Exception{
MyThead myThead=new MyThead("A");
MyThead my=new MyThead("B");
myThead.start();
myThead.join(3000);//线程A先执行3秒,3秒后交替
my.start();
}
}
class MyThead extends Thread{
MyThead(String name) {
super(name);
}
@Override
public void run() {
for(int i=0;i<5;i++){
System.out.println("this is "+Thread.currentThread().getName());
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
return;
}
}
}
}
执行结果
this is A
this is A
this is A
this is B
this is A
this is B
this is A
this is B
this is B
this is B
yield方法:使得当前线程的运行状态变成就绪状态。即将下一次执行的机会让掉,让其他或者自己的线程执行,也就是谁先抢到谁执行。
public class Sleep {
public static void main(String args[])throws Exception{
MyThead myThead=new MyThead("A");
MyThead my=new MyThead("B");
MyThead c=new MyThead("C");
myThead.start();
c.start();
my.start();
}
}
class MyThead extends Thread{
MyThead(String name) {
super(name);
}
@Override
public void run() {
for(int i=0;i<5;i++){
System.out.println("this is "+Thread.currentThread().getName());
if(i%3==0){
System.out.println("--------");
yield();
}
}
}
}
执行结果
this is A
--------
this is B
--------
this is C
--------
this is B
this is A
this is A
this is A
--------
this is B
this is C
this is A
this is C
this is B
--------
this is C
--------
this is B
this is C