zoukankan      html  css  js  c++  java
  • 2015年11月25 Java基础系列(二)Thread Runnable线程初级讲解

    序,线程是比进程小的进程,非常广泛的被使用。 

    一、继承Thread实现线程操作

    1、注意setDaemon(boolean)方法,参数为true时为守护线程,参数为false时为用户线程。

    守护线程的意思是生命周期由创建此线程的线程(进程)决定,创建线程死亡,则守护线程死亡。与之对应的是用户线程,用户线程的生命周期由自己决定,不受其他线程约束。

    例如下面:first线程由主线程main生成,则main方法死亡时,first线程也随之消亡。

    2、重写run()方法实现业务逻辑代码。run()方法不接受参数,并且无返回值。

    3、启动线程需要调用Thread对象的start()方法。

    package com.huawei.demo;
    
    import java.io.IOException;
    
    public class TryThread extends Thread {
        private String firstName;
        private String secondName;
        private long sleepTime;
    
        public TryThread(String firstName, String secondName, long sleepTime) {
            this.firstName = firstName;
            this.secondName = secondName;
            this.sleepTime = sleepTime;
            setDaemon(true);// 参数为true时为守护线程,参数为false时为用户线程
        }
    
        public static void main(String[] args) {
            Thread first = new TryThread("Hopalong ", "Cassidy", 2000L);
            Thread second = new TryThread("Marrilyn ", "Monroe", 3000L);
            Thread thrid = new TryThread("Slim ", "Pickens", 5000L);
            System.out.println("Press Enter when you have had enough...
    ");
            first.start();// 启动线程
            second.start();// 启动线程
            thrid.start();// 启动线程
    
            try {
                System.in.read();
                System.out.println("Enter Pressed...
    ");
            } catch (IOException e) {
                System.out.println(e);
            }
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    System.out.println(firstName);
                    sleep(sleepTime);// 休眠一定的时间
                    System.out.println(secondName);
                } catch (InterruptedException e) {
                    System.out.println(firstName + secondName + e);
                }
    
            }
        }
    
    }

    运行结果之一:

    Press Enter when you have had enough...
    
    Hopalong 
    Marrilyn 
    Slim 
    Cassidy
    Hopalong 
    Monroe
    Marrilyn 
    Pickens
    Slim 
    Cassidy
    Hopalong 
    Cassidy
    Hopalong 
    Monroe
    Marrilyn 
    Pickens
    Slim 
    Cassidy
    Hopalong 
    Monroe
    Marrilyn 
    
    Cassidy
    Hopalong 
    Enter Pressed...
    

    二、停止线程

    interrupt()、isInterrupted()、、、、

    线程可以调用Thread对象的interrupt()方法来发送信号给另一个线程告诉它该停止运行了。这本身并不能停止线程,它只是在线程中设置一个标志,指出有一个中断请求。

    要想使这个标志起作用必须在run()方法中检测它。发生这种情况时,sleep()方法检测线程是否已经被中断,如果已经被中断,就会抛出一个InterruptedException异常。

    可以通过调用线程的isInterrupted()方法检测线程是否已经中断。如果被检测的interrupt()方法被调用了,isInterrupted()方法就会返回true。

    注意这只能判断线程是否已经通过调用interrupt()方法设置了中断标志,而不能确定线程是否仍在运行。设置线程的中断标志却仍可以运行,并不是说调用了interrupt()方法线程就要终止。测试线程是否仍在运行可以调用isAlive()方法,如果线程没有终于,该方法返回true;

    实例方法isInterrupted()对于线程的中断标志没有影响,如果中断标志设置了,调用该方法后仍然设置。但是Thread类中的静态方法isInterrupted()却不同。它测试当前运行的线程是否被中断,如果已经中断,它清除当前Thread对象的中断标志并返回true。

    当抛出InterruptedException异常时,线程中记录中断的标志被清除,所以接下来的isInterrupted()或interrupted()调用会返回false。

    三、连接线程

    如果一个线程中需要等待另一个线程消亡,可以调用join()方法来处理希望消亡的线程。join()方法将暂停当前的线程,直到指定的线程消亡。

    thread1.join();

    thread1.join(1000);也可指定一个时间,等待另一个线程消亡的毫秒数。

    四、实现Runnable实现线程操作

    package com.huawei.demo;
    
    import java.io.IOException;
    
    public class JumbleNames implements Runnable {
    
        private String firstName;
        private String secondName;
        private long sleepTime;
    
        public JumbleNames(String firstName, String secondName, long sleepTime) {
            super();
            this.firstName = firstName;
            this.secondName = secondName;
            this.sleepTime = sleepTime;
        }
    
        public static void main(String[] args) {
            Thread first = new Thread(new JumbleNames("Hopalong ", "Cassidy", 500L));
            Thread second = new Thread(new JumbleNames("Marrilyn ", "Monroe", 800L));
            Thread third = new Thread(new JumbleNames("Slim ", "Pickens", 1000L));
            first.setDaemon(true);//守护线程
            second.setDaemon(true);//守护线程
            third.setDaemon(true);//守护线程
            System.out.println("Press Enter when you have had enough...
    ");
            first.start();// 启动线程
            second.start();// 启动线程
            third.start();// 启动线程
            try {
                System.in.read();
                System.out.println("Enter Pressed...
    ");
            } catch (IOException e) {
                System.out.println(e);
            }
            System.out.println("Ending main()
    ");
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    System.out.println(firstName);
                    Thread.sleep(sleepTime);// 休眠一定的时间
                    System.out.println(secondName);
                } catch (Exception e) {
                    System.out.println(firstName + secondName + e);
                }
    
            }
        }
    
    }

    1、为线程设置名称

    Thread first = new Thread(new JumbleNames("Hopalong ", "Cassidy", 500L),"firstThread");

    默认线程名称为Thread*加上一个序列号,也可以指定线程名称。

    可以通过调用Thread对象的getName()来获得指定的线程名。也可以通过Thread中定义的setName()方法来改变线程名。

    五、同步处理-使用方法

    六、同步处理-同步语句块

    七、线程间通信

    八、线程优先级

    九、死锁

  • 相关阅读:
    正则表达式(通用篇)
    Ubantu server部署django/flask项目
    Ubantu环境下安装mysql方法
    使用阿里大于发短信(简单版)
    SQLALchemy学习笔记(mysql+python环境)
    windows 安装使用 Memcached
    pycharm2019版本可用破解
    SVN使用教程
    Jquery学习
    css兼容问题
  • 原文地址:https://www.cnblogs.com/yaochc/p/4993475.html
Copyright © 2011-2022 走看看