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+& ...
随机推荐
- 安装gcc过程中遇到相互依赖的问题
在离线安装gcc的时候需要安装一些包,但是在安装 glibc-common glibc遇到一个很恶心的问题,这两个包相互依赖. 经查询才发现需要一起安装这两个依赖包.真是有趣的很 rpm -iv ...
- hdu 3500 还是搜索
这道题目由于每走一步的时候毛毛球是可以变换的 换言之 主体不唯一 所以这里搜索的设计有变化 再就是几个回溯的过程要注意.,. 小心使得万年船 #include <iostream> #i ...
- 基于APM实现RPC服务和消息队列的指定消费
本文内容是基于公司现有框架整理的一篇专利文章.该框架包含完整的一套DevOps流程,包括工单系统(容器申请.服务部署等)\配置中心\路由配置中心\服务治理平台\消息治理平台\葛朗台(基于Docker+ ...
- WCF和SOA的简介
1 什么是SOA:面向服务架构(service oriented architecture),他属于一种组件架构模式.SOA追求的是服务提供方和服务使用方的高度解耦. 服务必须是自解释的,也就是说必须 ...
- element ui的照片墙 默认显示照片
参考地址: element ui的照片墙 默认显示照片 照片显示的数据格式是:[{name: '', url: ''}],:file-list=""默认显示的图片 实际项目开发中需 ...
- CHD-5.3.6集群上Flume的文件监控
收集hive的log hive的运行日志: /home/hadoop/CDH5.3.6/hive-0.13.1-cdh5.3.6/log/hive.log * memory *hdfs ...
- 第一章、VUE-挂载点-实例成员-数据-过滤器-文本指令-事件指令-属性指令-表单指令-01
目录 路飞项目 vue vue 导读 vue 的优势 渐进式框架 引入 vue 实例成员 - 挂载点 el js 对象(字典)补充 实例成员 - 数据 data 实例成员 - 过滤器 filters ...
- Scala高阶函数与泛型
1. Scala中的函数 在Scala中,函数是“头等公民”,就和数字一样.可以在变量中存放函数,即:将函数作为变量的值(值函数). 2. scala中的匿名函数,即没有函数名称的函数,匿名函数常作为 ...
- SURF算法源代码OPENSURF分析
SURF算法源代码分析 平台:win x64 + VS2015专业版 +opencv2.4.11 配置类似参考OPENSIFT,参考我的另一篇博客:https://www.cnblogs.com/Al ...
- 安全开发Java动态代理
关于安全开发的一些思考 之前面试某宝的时候,某人问过我,如果解决开发不懂安全的问题,就比如说SSRF,XEE这样的漏洞,如果一旦发生,应该如果立刻去响应,并帮助开发人员修复漏洞,难道写一个jar包?然 ...