码迷,mamicode.com
首页 > 编程语言 > 详细

多线程-方法介绍

时间:2016-05-18 07:00:13      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:多线程

1.sleepwait的区别?

    1.sleep必须指定时间,wait可以指定可以不指定。

    2.sleepwait都可以让线程处于冻结状态,释放执行权。(相同点)

    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()是强制清除等待状态。


3.setDaemon

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不论处于什么状态,都会自动停止。

4.join

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!