标签:多线程
1.sleep和wait的区别?
1.sleep必须指定时间,wait可以指定可以不指定。
2.sleep和wait都可以让线程处于冻结状态,释放执行权。(相同点)
3.持有锁的线程执行sleep,不释放锁,持有锁的线程执行到wait释放锁。
4.sleep到时间会自动醒,wait没有指定时间,只能被其他线程通过notify唤醒。
2.如何让线程走向消亡
一是线程的任务没了,二是stop()是强制停止线程,但是会有风险.java提供的两种方法
1.线程任务中定义循环语句:只要定义变量控制住循环。就可以控制线程的结束
2.interrupt方法
class StopThread implements Runnable{
private boolean flag = true;
public void run (){
/*
线程任务中必然需要定义循环语句。
只要定义变量控制住循环。就可以控制线程的结束。
*/
while(flag){
System.out.println(Thread.currentThread().getName()+"......run");
}
}
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();
int num = 0;
while(true){
if(num++ == 50){
st.setFlag();//当条件满足时,将线程任务中的标记改为false。让线程停止。
break;
}
System.out.println(Thread.currentThread().getName()+"....."+num);
}
System.out.println("over");
}
}class StopThread implements Runnable{
private boolean flag = true;
public synchronized void run (){
while(flag){
try{
wait();
//如果线程被等待很长时间,是无法继续判断标记的,线程并没有停下来。
}
catch (InterruptedException e){
System.out.println(Thread.currentThread().getName()+".....Exception");
flag = false;
}
System.out.println(Thread.currentThread().getName()+"......run");
}
}
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();
int num = 0;
while(true){
if(num++ == 50){
//对t1进行一次中断,意思是将t1的冻结状态清除。让其恢复执行资格。
t1.interrupt();
t2.interrupt();
break;
}
System.out.println(Thread.currentThread().getName()+"....."+num);
}
System.out.println("over");
}
}不是所有的程序能用的notify(), interrupt()是强制清除等待状态。
public final void setDaemon(boolean on)
将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,也就是没有前台线程运行的时候,Java 虚拟机退出。
调用该方法必须在启动线程前调用。
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.setDaemon(true);//将t2标记成守护线程(后台线程)
t2.start();
int num = 0;
while(true){
if(num++ == 50){
//对t1进行一次中断,意思是将t1的冻结状态清除。让其恢复执行资格。
t1.interrupt();
break;
}
System.out.println(Thread.currentThread().getName()+"....."+num);
}
System.out.println("over");
}
}Thread-1不论处于什么状态,都会自动停止。
public final void join() throws InterruptedException
等待该线程终止。
class Demo implements Runnable{
private String name;
Demo(String name){
this.name = name;
}
public void run(){
for(int x=0; x<20; x++){
System.out.println(Thread.currentThread().getName()+"...."+x+"...."+name);
}
}
}
class ThreadDemo_Join {
public static void main(String[] args) throws Exception{
Demo d1 = new Demo("小强");
Demo d2 = new Demo("旺财");
Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2);
t1.start();
t1.join();
//主线程等待t1线程终止。主线程立刻释放执行权,没了执行资格,等t1执行终止后,主线程再继续执行
t2.start();
//t1.join();
//放在这行,cpu从执行t2切换到执行t1.join()的时候.这时候,t2和main都要等t1结束了
for(int x=0; x<20; x++){
System.out.println("main......"+x);
}
}
}标签:多线程
原文地址:http://8477424.blog.51cto.com/8467424/1774507