前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java多线程

Java多线程

作者头像
待你如初见
发布2018-08-02 10:07:24
4680
发布2018-08-02 10:07:24
举报
文章被收录于专栏:待你如初见待你如初见

Java多线程基础概念

程序是指令、数据及其组织形式的描述,进程是程序的实体。 进程:程序(任务)的执行过程,具有动态性;持有资源(共享内存,共享文件)和线程,是系统进行资源分配和调度的基本单位。 线程:有时被称为轻量级进程,是程序执行流的最小单元,线程共享进程的所有资源 进程和线程的关系:一对多,同一进程可以拥有多个线程 线程之间的关系(交互):互斥、同步

线程的实现方法

1、继承java.lang包下的Thread类,覆写Thread的run()方法 2、实现java.lang.Runnable接口,同样在run()方法中实现运行在线程上的代码

volatile

volatile保证了线程能够正确的读取其他线程写入的值,解决了可见性的问题

多线程目的

多线程编程的目的,就是”最大限度地利用CPU资源”,当某一线程的处理不需要占用CPU而只和I/O,OEMBIOS等资源打交道时,让需要占用CPU资源的其它线程有机会获得CPU资源。

代码语言:javascript
复制
/**
 * 线程1
 */
public class ArmyRunnable implements Runnable {

    //volatile 保证了可以正确读取其他线程写入的值
    //因为可见性的问题可能无法正确读到值可见性 jef JMM
    volatile boolean keepRunning = true;

    @Override
    public void run() {

        while (keepRunning){
            for (int i = 0; i < 5 ; i++) {
                System.out.println(Thread.currentThread().getName()+"当前执行["+i+"]");
                //让出处理器时间,下次调用不一定会调用哪个

                Thread.yield();
            }

        }
        System.out.println(Thread.currentThread().getName()+"执行结束");
    }
}
代码语言:javascript
复制
/**
 * 第二个线程
 */
public class PersonThread extends Thread{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"03线程开始了");
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"03线程正在执行");

        }

        System.out.println(Thread.currentThread().getName()+"03线程结束了");

    }
}
代码语言:javascript
复制
/**
 * RUNING
 */
public class Stage extends Thread{

    @Override
    public void run() {

        System.out.println("Ready Go!!!");

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        ArmyRunnable armyRunnable1 = new ArmyRunnable();
        ArmyRunnable armyRunnable2 = new ArmyRunnable();

        Thread thread1 = new Thread(armyRunnable1,"线程一");
        Thread thread2 = new Thread(armyRunnable2,"线程2");

        //启动线程
        thread1.start();
        thread2.start();

        //当前本线程休眠
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //线程03开始执行
        System.out.println("03线程开始执行");

        Thread sanCheng = new PersonThread();
        sanCheng.setName("03线程");
        System.out.println("03线程运行中");


        armyRunnable1.keepRunning = false;
        armyRunnable2.keepRunning = false;

        try {
            thread2.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        sanCheng.start();

        try {
            sanCheng.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("运行结束");

    }

    public static void main(String[] args) {
        new Stage().start();
    }
}

关于线程停止

interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态,然后该线程还是继续运行的 @Java线程——如何正确停止线程 一、错误一:stop()方法 1、not stop:stop()方法会使线程戛然而止 2、使程序突然中止,无法完成完整的业务步骤,也无法进行清理工作 二、错误二:interrupt()方法 1、interrupt()方法只能设置interrupt标志位(且在线程阻塞情况下,标志位会被清除,更无法设置中断标志位),无法停止线程 三、正确方法:设置退出标志 1、使用退出标志位来停止while循环 2、完成最后一次业务后跳出while循环后,之后进行一些清理工作

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java多线程基础概念
  • 线程的实现方法
    • volatile
      • 多线程目的
      • 关于线程停止
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档