Java基础_死锁、线程组、定时器Timer
一、死锁问题:
死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
比如,线程一需要第一把所,此时锁处于空闲状态,给了线程一,线程二需要第二把所,第二把锁也处于空闲状态,给了线程二,这样是没问题的。
但是,当线程一需要第一把所,线程二需要第二把所后未归还,线程一又需要第二把锁,此时线程一就会一直等待线程二将锁归还,可线程二还是需要线程一的锁,也处于等待的状态,因此,线程一和线程二都保持循环等待,两个线程都无法做完事情归还锁,二者出现死锁情况。。。

package com.Gary1;
public class DeadLock {
public static Object lock1 = new Object();
public static Object lock2 = new Object();
public static void main(String[] args) {
new Thread(new Thread1()).start();
new Thread(new Thread2()).start();
}
}
class Thread1 implements Runnable{
@Override
public void run() {
synchronized(DeadLock.lock1) {
System.out.println("取得第一把锁之后要做的事情");
try {
//耗时100毫秒,继续做一些事情
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(DeadLock.lock2) {
System.out.println("Thread1同时取得两把锁之后要做的事情");
}
}
}
}
class Thread2 implements Runnable{
@Override
public void run() {
synchronized(DeadLock.lock2) {
System.out.println("取得第二把锁之后要做的事情");
try {
//耗时100毫秒,继续做一些事情
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(DeadLock.lock1) {
System.out.println("Thread2同时取得两把锁之后要做的事情");
}
}
}
}
DeadLock.java
避免这种情况出现最好的方法:解决上锁的顺序
两边线程上锁顺序lock1->lock2

package com.Gary1;
public class DeadLock {
public static Object lock1 = new Object();
public static Object lock2 = new Object();
public static void main(String[] args) {
new Thread(new Thread1()).start();
new Thread(new Thread2()).start();
}
}
class Thread1 implements Runnable{
@Override
public void run() {
synchronized(DeadLock.lock1) {
System.out.println("取得第一把锁之后要做的事情");
try {
//耗时100毫秒,继续做一些事情
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(DeadLock.lock2) {
System.out.println("Thread1同时取得两把锁之后要做的事情");
}
}
}
}
class Thread2 implements Runnable{
@Override
public void run() {
synchronized(DeadLock.lock1) {
System.out.println("取得第二把锁之后要做的事情");
try {
//耗时100毫秒,继续做一些事情
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(DeadLock.lock2) {
System.out.println("Thread2同时取得两把锁之后要做的事情");
}
}
}
}
DeadLock.java
二、线程组ThreadGroup 默认处于同一个组里面
使用线程组可以统一设置这个组内线程的一些东西。比如设置优先级,设置是否是守护线程
ThreadGroup tg = new ThreadGroup("我们的线程组");
Thread t1 = new Thread(tg,r);
Thread t2 = new Thread(tg,r);
//批量管理
tg.interrupt();//中断里边所有线程
tg.setDaemon(true);//设置守护线程
tg.setMaxPriority(9);//设置线程组最大优先级

package com.Gary1;
public class ThreadGroupDemo {
public static void main(String[] args) {
MyRunnable r = new MyRunnable();
ThreadGroup tg = new ThreadGroup("我们的线程组");
Thread t1 = new Thread(tg,r);
Thread t2 = new Thread(tg,r);
//批量管理
tg.interrupt();//中断里边所有线程
tg.setDaemon(true);//设置守护线程
tg.setMaxPriority(9);//设置线程组最大优先级
//ThreadGroup tg = t1.getThreadGroup();
//输出线程名字
//System.out.println(tg.getName());
//输出线程组名字
//System.out.println(t2.getThreadGroup().getName());
t1.start();
t2.start();
}
}
ThreadGroupDemo.java
package com.Gary1;
public class MyRunnable implements Runnable{
private String data = "";
@Override
public void run() {
for(int i=0;i<100;i++) {
Thread t = Thread.currentThread();
System.out.println(t.getName()+":"+i);
}
}
}
MyRunnable.java
三、定时器Timer
作用:一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。
使用类:Timer和TimerTask
常用方法:
timer.schedule(TimerTask task, long delay)
timer.schedule(TimerTask task, long delay, long period)
timer.schedule(TimerTask task, Date time)
timer.cancel();
public static void main(String[] args) {
//Timer TimerTask
Timer t = new Timer();
//定义一个定时器任务,2000毫秒开始执行
//t.schedule(new MyTimerTask(), 2000);
//定义一个定时器任务,2000毫秒开始执行,每个3000毫秒执行一次
//t.schedule(new MyTimerTask(), 2000,3000);
//在哪个时间开始执行这个任务
//t.schedule(new MyTimerTask(), time);
//终止定时器任务执行
//timer.cancel();
}
package com.Gary1; import java.util.Timer;
import java.util.TimerTask; public class TimerDemo {
public static void main(String[] args) {
//Timer TimerTask
Timer t = new Timer(); //定义一个定时器任务,2000毫秒开始执行
//t.schedule(new MyTimerTask(), 2000);
//定义一个定时器任务,2000毫秒开始执行,每个3000毫秒执行一次
//t.schedule(new MyTimerTask(), 2000,3000);
//在哪个时间开始执行这个任务
//t.schedule(new MyTimerTask(), time);
//终止定时器任务执行
//timer.cancel();
} } class MyTimerTask extends TimerTask{ @Override
public void run() {
System.out.println("定时器任务"); } }
TimerDemo.java
Java基础_死锁、线程组、定时器Timer的更多相关文章
- Java基础_线程的使用及创建线程的三种方法
线程:线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 进程:进 ...
- Java多线程编程(五)定时器Timer
一.定时器Timer的使用 在JDK库中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务.Timer类的主要作用就是设置计划任务,但封装任务的类确实TimerTask类,执行计 ...
- Java多线程16:线程组
线程组 可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示: 线程组的作用是:可以批量管理线程或线程组对象,有效地对线 ...
- JAVA基础拾遗-论线程池的线程粒度划分与深浅放置
摘要:多线程任务处理对提高性能很有帮助,在Java中提供的线程池也方便了对多线程任务的实现.使用它很简单,而如果进行了不正确的使用,那么代码将陷入一团乱麻.因此如何正确地使用它,如以下分享,这个技能你 ...
- Java多线程核心技术(六)线程组与线程异常
本文应注重掌握如下知识点: 线程组的使用 如何切换线程状态 SimpleDataFormat 类与多线程的解决办法 如何处理线程的异常 1.线程的状态 线程对象在不同运行时期有不同的状态,状态信息就处 ...
- java 多线程 24 : 线程组
线程组 可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示: 线程组的作用是:可以批量管理线程或线程组对象,有效地对线 ...
- Java 基础 多线程和线程池基础
一,多线程 1.1 多线程介绍 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是进程中的一个执行单元,负 ...
- Java基础_通过模拟售票情景解决线程不安全问题
用代码来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100张车票,一个售票点用一个线程表示 第一种方法:通过继承Thread类的方法创建线程 package com.Gary1; publi ...
- Java基础_循环嵌套_打印乘法口诀、菱形,各种图形,计算二元一次和三元一次方程组_7
循环嵌套 打印乘法口诀 for(int j=1;j<=9;j++){ for(int i=1;i<=j;i++){ System.out.print(i+"*"+j+& ...
随机推荐
- 怎样设置cookie生效的域名和路径
Domain 属性指定浏览器发出HTTP请求时, 哪些域名需要附带这个Cookie. 比如 Domain 设置为 example.com, 那 abc.example.com 也会在发起请求时附带这个 ...
- [Tarjan系列] 无向图e-DCC和v-DCC的缩点
上一篇讲了如何应用Tarjan算法求出e-DCC和v-DCC. 那么这一篇就是e-DCC和v-DCC的应用之一:缩点. 先讲e-DCC的缩点. 我们把每一个e-DCC都看成一个节点,把所有桥边(x,y ...
- Angular7如何动态刷新Echarts图表
1 概述 echarts是百度的开源图表插件 Angular中引入echarts网上教程很多 Angular引入echarts,并使用动态刷新 2 安装 请参考大神的博客:https://blog.c ...
- java7:核心技术与最佳实践读书笔记——类加载
流程:class -> 加载 -> jvm虚拟机 -> 链接 . 一.类加载器概述 1.引出 类加载器也是一个java类,java.lang.ClassLoader类是所 ...
- 谈谈对Spring IOC的理解(转发)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 检索 COM 类工厂中 CLSID 为 {13C28AD0-F195-4319-B7D7-A1BDAA329FB8} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))。
上午前客户突然来电说换了台电脑重新装的程序不能正常用,发来错误提示如图: 这错误显然不是程序错误,异常写的很清楚 ,COM组件没注册,搜一下CLSID, 原来是GridReport++ ,参考地址: ...
- 一个SDL2.0程序的分析
//把图片加载到SDL_Texture SDL_Texture* loadTexture(const std::string &file, SDL_Renderer *ren){ ...
- Java秒杀实战 (七)安全优化
转自:https://blog.csdn.net/qq_41305266/article/details/81174782 一.隐藏秒杀地址 思路:秒杀开始前,先去请求接口获取秒杀地址 1.接口改造, ...
- qt打包发布
需要用到qt自带工具windeployqt.exe 安装 以qt 5.8.0为例 安装qt-opensource-windows-x86-mingw530-5.8.0.exe即可 构建Release版 ...
- 5.AOP配置与应用(annotation的方式)
步骤: a)在beans.xml文件中加上对应的xsd文件 spring-aop.xsd b)加上<aop:aspectj-autoproxy>,使用aspectj来完成aop <! ...