Java多线程

Java多线程基础概念

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

线程的实现方法

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

volatile

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

多线程目的

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

/**
 * 线程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()+"执行结束");
    }
}
/**
 * 第二个线程
 */
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线程结束了");

    }
}
/**
 * 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循环后,之后进行一些清理工作

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏博岩Java大讲堂

多线程--同步与锁

2343
来自专栏我和PYTHON有个约会

16.pass关键字

在项目开发的过程中,某些情况下,我们定义了函数,但是对于函数中具体的代码临时没有确定,如:

1023
来自专栏恰童鞋骚年

你必须知道的指针基础-6.内存的初始化及结构体的使用

  当我们创建一个内存区域的时候,内存中的数据可能是乱七八糟的(可能是其他代码用过后遗留的数据),如下面一段代码:

832
来自专栏Hongten

java中的sleep()和wait()的区别

对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

902
来自专栏py+selenium

python爬虫常用正则表达式组合匹配

正则表达式在线测试工具:http://tool.oschina.net/regex/?optionGlobl=global

1771
来自专栏C/C++基础

C++中cin的详细用法

cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象...

2103
来自专栏JAVA高级架构

深入了解 Java 之虚拟机内存

在讨论JVM内存区域分析之前,先来看一下Java程序具体执行的过程: ? Java 程序的执行过程:Java 源代码文件(.Java文件)-> Java Com...

3457
来自专栏移动开发面面观

Java学习笔记——内存管理Java内存管理

1263
来自专栏Java架构沉思录

Java虚拟机内存初探

Java 程序的执行过程:Java 源代码文件(.Java文件)-> Java Compiler(Java编译器)->Java 字节码文件(.class文件)-...

1492
来自专栏JMCui

多线程编程学习二(对象及变量的并发访问).

一、概念 非线程安全:会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是"脏读",也就是取到的数据其实是被更改过的. 线程安全:获得的实例变...

39614

扫码关注云+社区

领取腾讯云代金券