多线程-方法介绍

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

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);
        }
    }
}
时间: 2024-10-12 20:13:25

多线程-方法介绍的相关文章

【python标准库学习】thread,threading(一)多线程的介绍和使用

在单个程序中我们经常用多线程来处理不同的工作,尤其是有的工作需要等,那么我们会新建一个线程去等然后执行某些操作,当做完事后线程退出被回收.当一个程序运行时,就会有一个进程被系统所创建,同时也会有一个线程运行,这个线程就是主线程main,在主线程中所创建的新的线程都是子线程,子线程通常都是做一些辅助的事.python中提供了thread和threading两个模块来支持多线程. python中使用线程有两种方式,第一种是用thread模块的start_new_thread函数,另一种是用threa

iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信

一.NSOperation NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加到NSOperationQueue中 系统会自动将NSOperationQueue中的NSOperation取出来 将取出的NSOperation封装的操作放到一条新线程中执行 NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类 使用NSOperation子类的方式有3种 N

C#多线程 为多核处理器而生的多线程方法Parallel.For和Parallel.ForEach

1.在.net4.0中,有了一个新的类库:任务并行库.它极大地简化了并行编程且内容丰富.这里仅介绍其中最简单的 Parallel.For循环和Parallel.ForEach循环.它们位于System.Threading.Tasks命名空间.它们是两个方法,这两个方法将迭代分别放在不同的处理器上并行处理,如果机器是多处理器或多核处理器,这样就会使性能大大提升. 2.例子用Parallel.For做计算,为数组赋值并打印,用Parallel.ForEach计算字符串数组每个元素的长度,运行结果:

Json数据的序列化与反序列化的三种常用方法介绍

以下内容是本作者从官网中看相应的教程后所做的demo,其体现了作者对相关知识点的个人理解..作者才疏学浅,难免会有理解不到位的地方..还请各位读者批判性对待... 本文主要介绍在Json数据的序列化与反序列化的过程中我经常用到的三种工具的基本使用方法,及其他们之间 的比较...希望能够对读者们有一些帮助... 这里介绍到的三种解析与生成Json数据的方法分别是:标准JSON解析与生成方法.使用gson解析与生成JSON数据 .使用fastJsson解析与生成JSON数据. 首先,这些工具都可以到

SVG DOM常用属性和方法介绍

将以Adobe SVG Viewer提供的属性和方法为准,因为不同解析器对JavaScript以及相关的属性和方法支持的程度不同,有些方法和属性是某个解析器所特有的.SVG支持DOM2标准. 12.2.1  文档初始化相关 evt属性 evt表示事件本身,可以通过evt获取与当前事件相关的信息,用户可以在script中定义响应函数,进行相应的处理.它与普通JavaScript脚本中的event基本相同,只不过在普通JavaScript的脚本中简写成“e”. ownerDocument属性 通过引

Memcached 常见命令 telnet 使用方法介绍

Memcached 常见命令: telnet 使用方法介绍: (1)建立telnet连接,命令"telnet 127.0.0.1 11211".win7下会提示"telnet不是内部或外部命令",解决方法是"控制面板"-->"程序和功能"-->"打开或关闭windows功能"-->勾选"telnet客户端". (2)添加数据--命令"add name 0 60

ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍

如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者其他. 1.创建序列 Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE 权限 CREATE SEQUENCE CUX_DEMO_SEQUENCEMINVALUE 1MAXVALUE 99999999999START WITH 1000

iOS开发多线程篇—多线程简单介绍

iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中执行 3.线程

jQuery用unbind方法去掉hover事件及其他方法介绍

近日项目开发十分的繁忙,其中一个需求是实现响应式导航.(响应式的问题我们在css相关的博客中再交流) 大家都知道导航是需要下来菜单效果的,必然就会用到 jQuery的 hover() 方法.若是导航放在ipad中,自然hover()就没有什么意义了.那该如何取消hover()并添加touch事件呢? 今天遇到jquery需要去掉hover的问题,原以为直接unbind(“hover”)就可以搞定,可是搞了半天都报错. 原因其实很简单,hover并不是事件.打开参考手册,hover其实由 mous