一、join()加入线程
调用join()方法后,主线程会进入阻塞,直到调用join()的线程执行完成,才继续回到主线程。
join()方法使用思路:join()方法主要由使用线程的程序使用,将大问题分解为许多个小问题,每个小问题分配一个线程,当所有小问题都解决完后,再回到主线程进行进一步操作。
class thread1 extends Thread{
private int i=1;
thread1(String name){
super(name);
}
public void run(){
for(;i<10;i++)
System.out.println(this.getName()+" "+i);
}
}
class thread2 implements Runnable{
private int i=1;
public void run(){
for(;i<10;i++)
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
class thread_Join{
public static void main(String args[]) throws Exception
{
thread1 t1=new thread1("thread-1");
thread2 t2=new thread2();
Thread t2_real0=new Thread(t2,"Thread-2");
t1.start();
Thread.currentThread().setName("MainThread");
for(int i=1;i<10;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
if(i==5){
t2_real0.start();
t2_real0.join();
}
}
}
}
输出结果:
MainThread 1
thread-1 1
MainThread 2
thread-1 2
thread-1 3
MainThread 3
thread-1 4
MainThread 4
thread-1 5
MainThread 5 //i=5,主线程进入阻塞,直至Thread-2执行完成
thread-1 6
thread-1 7
thread-1 8
thread-1 9
Thread-2 1
Thread-2 2
Thread-2 3
Thread-2 4
Thread-2 5
Thread-2 6
Thread-2 7
Thread-2 8
Thread-2 9
MainThread 6
MainThread 7
MainThread 8
MainThread 9
二、后台线程/守护线程/精灵线程
将线程设置为后台线程:t.setDaemon(true);
启动线程:t.start();
要设置线程为后台线程必须在启动线程之前。
可使用isDaemon判断线程是否后台线程
如果所有的前台线程都死亡,后台线程也会自动死亡。
主线程默认是前台线程,前台线程的子线程默认是前台线程,后台线程的子线程默认是后台线程。
三、线程睡眠sleep()
class testThread{
public static void main(String args[]) throws Exception{
Thread.sleep(1000);
Thread.currentThread().sleep(10000);
}
}
上述两条语句都是使主线程睡眠的语句。
四、线程让步yield()
Thread.yield(); //让当前线程让步
五、改变线程优先级
setPriority(int newPriority); 优先级范围为整数的1-10
例如
Thread.currentThread().setPriority(6);//如果只有一个主线程在运行,则当前语句则是设置主线程优先级为6
Thread.currentThread().setPriority(MAX_PRIORITY);//如果只有一个主线程在运行,则当前语句则是设置主线程优先级为10
t.setPriority(7);//设置线程对象t的优先级为7
可使用getPriority()获得当前线程优先级,如:
int i=t.getPriority();