/**
wait()和sleep()的异同:
相同:都可让线程处于等待状态
不同:1)wait()可以指定时间,也可以不指定时间
sleep()必须指定时间
2)wait()释放cpu资源,释放锁(只用于同步中,同步中的线程只有同时持有cpu资源和锁才能执行)
sleep()释放cpu资源,不释放锁。
异常会提示发生在哪个线程上,异常会结束所在线程。
如何停止线程?
原理:使run方法结束
线程任务通常都有循环,因为开启线程就是为了执行需要一些时间的代码
只要通过标记flag控制循环就可以结束run方法
线程Thread的方法:
interrupt():中断线程
强制唤醒被wait的线程,使他获得执行资格,会产生InterruptedException
然后修改线程停止标记flag 停止线程
setDaemon(boolean on):守护线程(后台线程)
刚创建的线程均为前台线程,当前台线程都结束时,后台线程会随着一起结束
join():等待线程结束
当主线程执行到t1.join()时,主线程释放执行权(由t1和其他线程竞争cpu执行权),当t1获得
执行权时会将t1线程一直执行到结束,然后唤醒主线程
setPriority():设置进程优先级(1~10,数字越大,优先级越高,默认线程优先级为5)
*/
class StopThread implements Runnable{
//标记flag用于停止线程
private boolean flag = true;
public synchronized void run(){
while(flag){
try{
wait();//线程0 1都在此等待
}
catch(InterruptedException e){
System.out.println(Thread.currentThread().getName()+"..."+e.toString());
}
System.out.println(Thread.currentThread().getName()+"...");
}
}
//提供改变flag的方法
public void setFlag(){
flag = false;
}
}
class StopThreadDemo
{
public static void main(String[] args)
{
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
for(int i = 1;i < 50;i++){
if (i == 40){
//中断线程0 1
t1.interrupt();
t2.interrupt();
//修改flag标记
st.setFlag();
}
System.out.println(Thread.currentThread().getName()+"..."+i);
}
System.out.println(Thread.currentThread().getName()+"...over");
}
}
2.多线程常见写法
class MutiThreadDemo
{
public static void main(String[] args)
{ //匿名内部类
new Thread()
{
public void run(){
for(int i = 0;i < 50;i++)
System.out.println(Thread.currentThread().getName()+"..."+i);
}
}.start();
//封装成一个任务
Runnable r = new Runnable(){
public void run(){
for(int i = 0;i < 50;i++)
System.out.println(Thread.currentThread().getName()+"..."+i);
}
};
new Thread(r).start();
//子类的run方法将会覆盖父类run方法(结合上面两种方法)
new Thread(new Runnable(){
public void run(){
System.out.println("Runnable run...");
}
}){
public void run(){
System.out.println("SubThread run...");
}
}.start();//SubThread run...
}
}