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. Java 进行时间处理

    Java 进行时间处理 一.Calendar (1).Calender介绍 Calendar的中文翻译是日历,实际上,在历史上有着许多种计时的方法.所以为了计时的统一,必需指定一个日历的选择.那现在最 ...

  2. apache common pool2原理与实战

    完整源码,请帮我点个star哦! 原文地址为https://www.cnblogs.com/haixiang/p/14783955.html,转载请注明出处! 简介 对象池顾名思义就是存放对象的池,与 ...

  3. 【转载】fedora22和win10之间的文件共享互访

    fedora22和win10之间的文件共享互访 钢铁侠与孔子 关注 2016.06.04 14:10* 字数 1327 阅读 2170评论 0喜欢 1 一,相关知识了解(本文执行环境为fedora22 ...

  4. KVM性能优化

    一.KVM为什么要调优 性能的损耗是关键.KVM采用全虚拟化技术,全虚拟化要由一个软件来模拟硬件,故有一定的损耗,特别是I/O,因此需要优化.KVM性能优化主要在CPU.内存.I/O这几方面.当然对于 ...

  5. openstack宿主机故障,虚拟实例恢复

    前言: 因为机房服务器运行不稳定的原因导致计算节点挂掉,然后上面的Centos7虚拟机在迁移之后开机报错.这个解决方法同样适用于其它操作系统的虚拟机.基于镜像创建的虚拟机实例. I/O error, ...

  6. IT菜鸟之交换机基础配置

    交换机属于二层设备(隶属于osi七层模型中的第二层:数据链路层,不识别不支持IP地址)  > 用户模式 用于登录设备 # 特权模式 用于查询设备配置 (config)# 全局模式 用于配置设备 ...

  7. DOCKER学习_015:Docker网络补充

    1 Docker容器使用LINK方式互通 在前面的网络实验中,当同一主机的两个Docker容器,使用Bridge网桥互通时,我们必须使用docker inspect Dockerid查找出Docker ...

  8. C语言的指针数组与指针数组

    一.指针数组与指针数组 1,指针数组 顾名思义,即一个元素全部是指针的数组,其形式与普通数组相似,形式如 *a[N]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...

  9. HarmonyOS去除页面顶部title的方式

    在config.json文件中module节点中添加如下代码 "metaData":{ "customizeData":[ { "name" ...

  10. 【分布式】-- 基于Nacos、OpenFeign搭建的微服务抽奖系统后台小案例

    1.项目介绍 最近入项目之前要求熟悉一下SpringCloud Nacos微服务基于Feign接口调用并整合Swagger2进行接口文档展示给前端,所以自己按照要求来编写并整合了一套基于SpringC ...