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+& ...
随机推荐
- linux实现一个定时任务
设置定时任务删除logs脚本数据 编写脚本 touch cleanLogs.sh #! /bin/sh -name "*.log*" -exec rm -f {} \; 使用r ...
- Java建造者模式(思维导图)
图1 建造者模式[点击查看大图] 基本的知识点已在思维导图中,下面是demo 1,Builder 为创建一个产品对象的各个部件指定抽象接口 public interface PersonBuilder ...
- TypeScript入门四:TypeScript的类(class)
TypeScript类的基本使用(修饰符) TypeScript类的抽象类(abstract) TypeScript类的高级技巧 一.TypeScript类的基本使用(修饰符) TypeScript的 ...
- Flutter 35: 图解自定义 View 之 Canvas (二)
小菜前几天整理了以下 Canvas 的部分方法,今天小菜继续学习 Canvas 第二部分. drawXXX drawShadow 绘制阴影 drawShadow 用于绘制阴影,第一个参数时绘制一个图形 ...
- CHD-5.3.6集群上Flume安装
Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and ...
- 第五章、Django之模型层----多表查询
目录 第五章.Django之模型层----多表查询 一.一对多字段增删改查 1.增 2.查 3.改 4. 删除 二.多对多的增删改查 1. 增 2. 改 3. 删 三.ORM跨表查询 四.正反向的概念 ...
- 在线预览word、excel文件
直接使用微软提供的在线预览服务. 免费 文件必须为网可访问地址,因为微软的服务器需要访问该文件
- RobHess的SIFT代码解析步骤四
平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 主要参考:1.代码:RobHess的SIFT源码 2.书:王永明 ...
- DB2 alter 新增/删除/修改列
SQL语句 增加列.修改列.删除列 1 添加字段 语法 : alter table 表名称 add 字段名称 类型 demo: alter table tableName add columnName ...
- linux程序对比