一、死锁问题:

死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

比如,线程一需要第一把所,此时锁处于空闲状态,给了线程一,线程二需要第二把所,第二把锁也处于空闲状态,给了线程二,这样是没问题的。

但是,当线程一需要第一把所,线程二需要第二把所后未归还,线程一又需要第二把锁,此时线程一就会一直等待线程二将锁归还,可线程二还是需要线程一的锁,也处于等待的状态,因此,线程一和线程二都保持循环等待,两个线程都无法做完事情归还锁,二者出现死锁情况。。。

packagecom.Gary1;public classDeadLock {public static Object lock1 = newObject();public static Object lock2 = newObject();public static voidmain(String[] args) {new Thread(newThread1()).start();new Thread(newThread2()).start();

}

}class Thread1 implementsRunnable{

@Overridepublic voidrun() {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 implementsRunnable{

@Overridepublic voidrun() {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

packagecom.Gary1;public classDeadLock {public static Object lock1 = newObject();public static Object lock2 = newObject();public static voidmain(String[] args) {new Thread(newThread1()).start();new Thread(newThread2()).start();

}

}class Thread1 implementsRunnable{

@Overridepublic voidrun() {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 implementsRunnable{

@Overridepublic voidrun() {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= newThread(tg,r);

Thread t2= newThread(tg,r);//批量管理

tg.interrupt();//中断里边所有线程

tg.setDaemon(true);//设置守护线程

tg.setMaxPriority(9);//设置线程组最大优先级

packagecom.Gary1;public classThreadGroupDemo {public static voidmain(String[] args) {

MyRunnable r= newMyRunnable();

ThreadGroup tg= new ThreadGroup("我们的线程组");

Thread t1= newThread(tg,r);

Thread t2= newThread(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

packagecom.Gary1;public class MyRunnable implementsRunnable{private String data = "";

@Overridepublic voidrun() {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 voidmain(String[] args) {//Timer TimerTask

Timer t = newTimer();//定义一个定时器任务,2000毫秒开始执行//t.schedule(new MyTimerTask(), 2000);//定义一个定时器任务,2000毫秒开始执行,每个3000毫秒执行一次//t.schedule(new MyTimerTask(), 2000,3000);//在哪个时间开始执行这个任务//t.schedule(new MyTimerTask(), time);//终止定时器任务执行//timer.cancel();

}

packagecom.Gary1;importjava.util.Timer;importjava.util.TimerTask;public classTimerDemo {public static voidmain(String[] args) {//Timer TimerTask

Timer t = newTimer();//定义一个定时器任务,2000毫秒开始执行//t.schedule(new MyTimerTask(), 2000);//定义一个定时器任务,2000毫秒开始执行,每个3000毫秒执行一次//t.schedule(new MyTimerTask(), 2000,3000);//在哪个时间开始执行这个任务//t.schedule(new MyTimerTask(), time);//终止定时器任务执行//timer.cancel();

}

}class MyTimerTask extendsTimerTask{

@Overridepublic voidrun() {

System.out.println("定时器任务");

}

}

TimerDemo.java

java定时器阻塞主线程_Java基础_死锁、线程组、定时器Timer相关推荐

  1. java定时器阻塞主线程_springboot定时任务线程阻塞踩坑

    场景描述 在使用Springboot整合定时任务,发现当某个定时任务执行出现执行时间过长的情况时会阻塞其他定时任务的执行. 问题定位 后续通过翻查Springboot的文档以及打印日志(输出当前线程信 ...

  2. java基础线程_Java基础之多线程没那么复杂!

    多线程的引入 1.什么是多线程 线程是程序执行的一条路径,一个进程中可以包含多条线程;多线程并发执行可以提高程序的效率 2.进程和线程之间的关系 操作系统可以同时执行多个任务,每个任务就是进程;进程可 ...

  3. java 单线程执行器_Java基础-并发编程-线程执行器executor

    线程实现方式 Thread.Runnable.Callable //实现Runnable接口的类将被Thread执行,表示一个基本任务 public interface Runnable { //ru ...

  4. java继承原理内存角度_Java基础知识巩固

    最近发现自己的Java基础知识还是有点薄弱,刚好有点空闲时间进行再补一补,然后进行整理一下,方便自己以后复习.其实个人认为Java基础还是很重要的,不管从事Java后端开发还是Android开发,Ja ...

  5. java5个线程_java基础thread——java5之后的多线程(浅尝辄止)

    承上启下 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock. 一.JD ...

  6. java结束全部操作代码_Java创建与结束线程代码示例

    这篇文章主要介绍了Java创建与结束线程代码示例,小编觉得挺不错的,这里分享给大家,供需要的朋友参考. 本文讲述了在Java中如何创建和结束线程的最基本方法,只针对于Java初学者.一些高级知识如线程 ...

  7. java 停止一个线程_Java如何停止一个线程

    线程正常执行完毕,正常结束. 2.监视某些条件,直到某些条件成立,结束线程. class TestMyThread extends Thread { private volatile boolean ...

  8. java 镶嵌创建线程_Java多线程——之一创建线程的四种方法

    1.实现Runnable接口,重载run(),无返回值 package thread; public class ThreadRunnable implements Runnable { public ...

  9. java 关闭守护线程_Java并发编程之线程生命周期、守护线程、优先级、关闭和join、sleep、yield、interrupt...

    Java并发编程中,其中一个难点是对线程生命周期的理解,和多种线程控制方法.线程沟通方法的灵活运用.这些方法和概念之间彼此联系紧密,共同构成了Java并发编程基石之一. Java线程的生命周期 Jav ...

最新文章

  1. P5175 数列(矩阵快速幂)
  2. 7-26 Windows消息队列(25 分)
  3. z370支持pcie信号拆分吗_定了!AMD B550主板确认将支持PCIE4.0,多项能力接近X570
  4. Spring、SpringMVC、SpringBoot、SpringCloud概述
  5. oracle技术之一次RMAN备份报错的诊断过程(五)
  6. 《Java就业培训教程》_张孝祥_书内源码_07
  7. javplayer 使用教程_童装裁剪之连衣裙打版教程 有图纸
  8. You can't specify target table 'UpdateInfo' for update in FROM clause
  9. 【读书笔记】金融理财,半佛推荐,小狗钱钱_2020.05.01
  10. C语言编写一个计算字符串长度的函数 my_strlen();
  11. 福利,架构师之路定制T恤
  12. “死”法不重样,一根数据线如何从“机器伴侣”变身电脑杀手?
  13. 玩转前端 Video 播放器
  14. IBM p系列小型机日常维护及故障排除时常用命令(检查IBM设备状态汇总)
  15. java 获取string值_java如何获取String里面的键值对:key=valuekey=value
  16. 产品宣传数据投放广告指标
  17. 仿淘宝商品详情页TabLayout+ListView
  18. 钉钉企业内部应用 - 获取考勤打卡结果
  19. Java 第十一届 蓝桥杯 省模拟赛 反倍数
  20. Arthas性能监控

热门文章

  1. python画平面直角坐标系_Python 数据可视化:重新认识坐标系
  2. python issuperset_Superset的各种疑难解答
  3. java url 缩略图_java根据url生成网页截图,缩略图 | 学步园
  4. python的decode函数报错_python2和python3的编码encode解码decode函数
  5. html中隐藏内容蜘蛛会抓取吗,蜘蛛会抓取识别JS、CSS、JSON,对SEO有什么影响
  6. jsp中能循环div吗_中药面膜安全靠谱吗?
  7. openmv识别物体并与单片机通信(STM32)
  8. 用unity制作能量护盾(1)
  9. java 注入日志_java框架学习日志-5(常见的依赖注入)
  10. 常州新北区华为云_常州高新区召开大数据时代健康产业创新大会