JAVA并行程序基础一

线程的状态

初始线程:线程的基本操作

1. 新建线程

新建线程只需要使用new关键字创建一个线程对象,并且用start() ,线程start()之后会执行run()方法

不要直接调用run()方法,它只会在当前线程串行执行run()中的方法。

重载run()方法有两种方式

  1. 直接继承Thread类
  2. 实现Runnable接口 它只有一个run()方法 在new Thread()时将接口实现类传入

2.终止线程

一般线程在执行完毕就会结束,无需手动关闭。但java也提供手动关闭的方法。

终止线程 JDK中有一个stop()方法。stop()方法被标注是一个遗弃的方法,因为直接执行stop方法会直接终止进程,并且立即释放这个线程所持有的锁。这会引起一些数据不一致问题。

对于自己写的一些无穷循环的线程可以自己做标记实现退出循环,进而由java虚拟机寻找合适的机会结束进程。

3.线程中断

直接执行stop()会引起严重的问题。JDK提供了另一种支持线程中断

线程中断不会是线程立即退出。而是给线程发一个通知,告知目标线程有人希望退出 之后的操作由目标自行决定

public void interrupt();//中断线程
public boolean isInterrupted() ;//判断线程是否中断
public static boolean interrupted() ;//判断线程是否中断,并清除当前中断状态

如果线程处于休眠状态,执行中断操作则会报出中断异常。

 Thread thread = new Thread(() -> {
while (true) { if (Thread.currentThread().isInterrupted()) {
System.out.println(Thread.currentThread().getName() + "线程退出");
break;
}
System.out.println(Thread.currentThread().getName() + "线程执行");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + "线程睡眠");
Thread.currentThread().interrupt();
}
}
});
thread.start();
thread.interrupt();

使用中断线程的方式退出线程 这种方式更强劲,可以处理wait(),sleep()操作,由于Thread.sleep()方法由于中断而抛异常,此时,它会清除中断的标记 。那么在下次循环就没有中断标记了,所以在catch字句中再次设置中断标记位。

4.等待(wait)与通知(notify)

wait()和notify()是支持线程之间协作的 一个对象在某个线程内调用wait()方法后此线程就会进入等待状态,自动释放当前线程所拿到的所有的锁。直到其他线程此对象执行notify()方法为止。

final static Object obj=new Object();
public static void main(String[] args) {
Thread Thread1=new Thread(()->{
synchronized (obj){
System.out.println(Thread.currentThread().getName()+"开始执行");
try {
System.out.println(Thread.currentThread().getName()+"开始等待");
obj.wait();
System.out.println(Thread.currentThread().getName()+"收到通知停止等待");
} catch (InterruptedException e) {
e.printStackTrace();
}
} }); Thread thread2=new Thread(()->{
synchronized (obj){ System.out.println(Thread.currentThread().getName()+"发送通知");
obj.notify();
System.out.println(Thread.currentThread().getName()+"通知完毕");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"休眠完毕");
}
}); Thread1.start();
thread2.start(); }

5.挂起(suspend)与继续执行(resume)线程

当一个线程执行了suspend()之后会立即停止执行直到 执行resume()后会重新执行。看起来很方便但这两个方法也是过时方法。不推荐使用。因为当线程执行suspend()不会释放任何锁资源,可能会导致系统无法正常运行。比较靠谱的是利用wait()和notify()方法来控制线程的暂停可运行

6.等待线程(join)和谦让(yield)

线程之间和协作如同人与人之间的合作,有时完成一件事需要另一件事先完成。在a线程执行b.join()就是线程a等待b执行完毕再继续执行

Thread.yield()方法执行后当前线程会让出CPU,重新与其他线程一起再次竞争执行权

JAVA并行程序基础一的更多相关文章

  1. Java并发程序设计(二)Java并行程序基础

    Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师链接:https://www.zhihu.com/question/27654579/answer/1 ...

  2. JAVA并行程序基础

    JAVA并行程序基础 一.有关线程你必须知道的事 进程与线程 在等待面向线程设计的计算机结构中,进程是线程的容器.我们都知道,程序是对于指令.数据及其组织形式的描述,而进程是程序的实体. 线程是轻量级 ...

  3. JAVA并行程序基础二

    JAVA并行程序基础二 线程组 当一个系统中,如果线程较多并且功能分配比较明确,可以将相同功能的线程放入同一个线程组里. activeCount()可获得活动线程的总数,由于线程是动态的只能获取一个估 ...

  4. 第2章 Java并行程序基础(三)

    2.8 程序中的幽灵:隐蔽的错误 2.8.1 无提示的错误案例 以求两个整数的平均值为例.请看下面代码: int v1 = 1073741827; int v2 = 1431655768; Syste ...

  5. Java并行程序基础。

    并发,就是用多个执行器(线程)来完成一个任务(大任务)来处理业务(提高效率)的方法.而在这个过程中,会涉及到一些问题,所以学的就是解决这些问题的方法. 线程的基本操作: 1.创建线程:只需要new一个 ...

  6. 第2章 Java并行程序基础(二)

    2.3 volatile 与 Java 内存模型(JMM) volatile对于保证操作的原子性是由非常大的帮助的(可见性).但是需要注意的是,volatile并不能代替锁,它也无法保证一些复合操作的 ...

  7. 第2章 Java并行程序基础(一)

    2.1 有关线程你必须知道的事 进程是系统进行资源分配和调度的基本单位,是程序的基本执行实体. 线程就是轻量级进程,是程序执行的最小单位. 线程的生命周期,如图2.3所示. 线程的所有状态都在Thre ...

  8. 到头来还是逃不开Java - Java13程序基础

    java程序基础 没有特殊说明,我的所有学习笔记都是从廖老师那里摘抄过来的,侵删 引言 兜兜转转到了大四,学过了C,C++,C#,Java,Python,学一门丢一门,到了最后还是要把Java捡起来. ...

  9. Spring MVC + Spring + Mybitis开发Java Web程序基础

    Spring MVC + Spring + Mybitis是除了SSH外的另外一种常见的web框架组合. Java web开发和普通的Java应用程序开发是不太一样的,下面是一个Java web开发在 ...

随机推荐

  1. 使用 cmake 来搭建跨平台的应用程序框架:C语言版本

    目录 一.前言 二.示例代码说明 1. 功能描述 2. 文件结构 3. cmake 构建步骤 4. Utils 目录说明 5. Application 目录说明 三.Linux 系统下操作步骤 1. ...

  2. JVM核心技术(第一篇)

    目录 Java基础知识 一. 字节码技术 二.JVM类加载器 类的加载时机 三.JVM内存结构 四.JVM启动参数 4.1 系统属性参数 4.2 运行模式 4.3 堆内存 4.4 GC相关 4.5 分 ...

  3. 29.Map,可变参数

    1.Map集合 1.1Map集合概述和特点[理解] 单列集合一次存一个元素 双列集合一次存两个元素 键:不能重复的        值:可以重复的 Map集合概述 interface Map<K, ...

  4. 客户端保存token到sessionStorage

    将token保存到客户端的sessionStorage 一.区分localStorage和sessionStorage localStorage是本地持久化存储 sessionStorage是浏览器会 ...

  5. [Linux] Linux C编程一站式学习 Part.3

    Linux系统编程 文件与I/O C标准I/O库函数与Unbuffered I/O函数 C标准I/O库函数printf().putchar().fputs(),会在用户空间开辟I/O缓冲区 系统函数o ...

  6. 《SystemVerilog验证-测试平台编写指南》学习 - 第1章 验证导论

    <SystemVerilog验证-测试平台编写指南>学习 - 第1章 验证导论 测试平台(testbench)的功能 方法学基础 1. 受约束的随机激励 2. 功能覆盖率 3. 分层的测试 ...

  7. 2019年又迎来Hi1620,鲲鹏920则是Hi1620系列的正式品牌和型号

    据记者了解,2013年华为就发布了Hi1610,2014年的Hi1612是ARM64位CPU,2016年的Hi1616是首颗支持多路的ARM处理器,2019年又迎来Hi1620,鲲鹏920则是Hi16 ...

  8. 009.kubernets的调度系统之污点和容忍

    Taints和Tolerations(污点和容忍) Taint需要与Toleration配合使用,让pod避开那些不合适的node.在node上设置一个或多个Taint后,除非pod明确声明能够容忍这 ...

  9. Linux 核心系统命令目录

    S5 Linux信息显示与搜索文件命令 S6 文件备份与压缩命令 S7 Linux用户管理及用户信息查询命令 S8 Linux磁盘与文件系统管理命令 S9 Linux 进程管理命令 S10 Linux ...

  10. shell应用之简单计算器

    1 #!/bin/bash 2 while : 3 do 4 read -p "请输入计算规则:" JS 5 if [ -z $JS ];then 6 exit 7 else 8 ...