zoukankan      html  css  js  c++  java
  • Java多线程基础

    Java多线程基础总结线程的创建、线程状态、如何中断线程与守护线程的概念。

    1、线程创建

    参考Java中创建线程的方式;

    2、线程暂停执行

    强迫当前线程暂停一段时间, 调用Thread.sleep(time)。注意:sleep函数传入的参数是毫秒单位,并且暂停的是当前执行Thread.sleep()的线程。例如间隔1秒控制台输出:

    Thread one = new Thread() {
        @Override
        public void run() {
            for (int i = 0; i <= 10; i++) {
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    
    one.start();

    3、线程优先级

    可以对线程设定优先级,设定优先级的方法是:

    Thread.setPriority(int n) // 1~10, 默认值5

    注意:不可依赖线程优先级保证优先线程一定先执行。

    4、线程状态

    线程的状态有:

    • New:新创建的线程,尚未执行;
    • Runnable:正在执行的线程;
    • Blocked:被阻塞的线程;
    • Wating:等待中的线程;
    • Timed Waiting:执行sleep方法等待中的线程;
    • Terminated:线程已终止。

    5、线程终止

    线程终止的原因有:线程正常终止:run方法执行到return 语句返回;线程异常终止:run方法遇到未捕获的异常意外终止。

    6、线程等待

    线程等待指的是,当前线程等待另一个线程执行结束后,再继续运行。通常在当前线程对目标线程调用join方法,表示待目标线程运行结束后,当前线程再继续执行。join重载方法可以设置超时时间,表示过时不候。

    Thread StudentThread = new Thread() {
        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Student");
        }
    };
    
    Thread KongRongThread = new Thread() {
        @Override
        public void run() {
            StudentThread.start();
            try {
                StudentThread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Kong Rong");
        }
    };
    KongRongThread.start();
    //Student
    //Kong Rong

    上述KongRongThread线程需等待StudentThread线程执行结束后,才能继续执行。其中如果 StudentThread.join() 的参数小于1000,表示不再等待 StudentThread线程。

    7、线程中断

    中断线程通常对目标线程调用interrupt方法,目标线程需要反复检测自身状态是否是interrupted状态。注意:使用interrupt方法仅仅是通知目标线程进行中断,是否中断由目标线程实现逻辑。

    另外,若当前线程使用join方法,正在等待目标线程执行;此时若当前线程被调用了interrupt方法,此时join方法会立刻抛出 InterruptedException。为了理解上述,抽象出老板、监工、民工三个线程示例。

    Thread worker = new Thread() {
        @Override
        public void run() {
            for (int i = 0; i <= 10 && !isInterrupted(); i++) {
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;
                }
            }
        }
    };
    
    Thread monitor = new Thread() {
        @Override
        public void run() {
            System.out.println("work start!");
            worker.start();
            try {
                worker.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            worker.interrupt();
    
        }
    };
    
    Thread boss = new Thread() {
        @Override
        public void run() {
            monitor.start();
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            monitor.interrupt();
        }
    };
    
    boss.start();

    boss线程,3秒钟后通知 monitor线程中断,monitor负责启动worker线程,并一直等待worker线程执行;worker线程负责间隔一秒钟向控制台输出。其中对monitor调用interrupt后,monitor线程中join方法立即抛出错误。并在结束之前通知worker线程中断,work线程会一直检查 isInterrupted 状态在sleep方法报错后,结束循环。

    另一个常用的中断线程的方法是设置标志位,用法与上述类似。

    public volatile boolean running = true;

    8、守护线程

    守护线程不会影响JVM进程结束,通常为其他线程服务。

    Thread t = new MyThread();
    t.setDaemon(true);
    t.start();
  • 相关阅读:
    理解BSTR数据类型 神奇的BSTR
    char *
    _variant_t和_bstr_t
    数据库中创建表(包括创建主键,外键,非空列,唯一)
    使用ADO实现BLOB数据的存取 -- ADO开发实践之二
    sql server 2005 修改动态端口,连接字符串为:需要改成:IP地址+逗号+端口号才行
    Bilateral Filtering(双边滤波) for SSAO
    关于在Arduino中调用DS1302模块
    关于电机驱动扩展板 L293D 马达板Arduino
    Arduino教程资料汇总(8月22日悄悄跟新了一下)
  • 原文地址:https://www.cnblogs.com/engeng/p/15540126.html
Copyright © 2011-2022 走看看