大龄屌丝自学笔记--Java零基础到菜鸟--034

Lock锁,死锁,线程组,线程池,定时器,练习题

1、Lock锁(接口)

lock();

unlock();

ReentrantLock是Lock的实现类。

2、死锁

同步的缺点:效率低,容易产生死锁。

死锁:两个或两个以上的线程,在争夺资源的过程中,发生的一种相互等待的现象。

 1 public class MyLock {
 2     public static final Object objA=new Object();
 3     public static final Object objB=new Object();
 4 }
 5
 6 public class DieLock extends Thread{
 7
 8     private boolean flag;
 9
10     public DieLock(boolean flag){
11         this.flag=flag;
12     }
13
14     @override
15     public void run(){
16         if(flag){
17             synchronized(MyLock.objA){
18                 System.out.println("if A");
19                 synchronized(MyLock.objB){
20                     System.out.println("if B");
21
22                 }
23             }
24         }else{
25             synchronized(MyLock.objB){
26                 System.out.println("else B");
27                 synchronzied(MyLock.objA){
28                     System.out.println("else A");
29                 }
30             }
31         }
32     }
33 }
34
35 public class Fin{
36     public static void main(String[] args){
37         DieLock dieLock1=new DieLock(true);
38         DieLock dieLock2=new DieLock(false);
39         dieLock1.start();
40         dieLock2.start();
41     }
42 }
43
44 //死锁

3、线程组

ThreadGroup类,可以对一批线程进行分类管理。

getThreadGroup();

4、线程池

Executros类,启动新线程成本太高,可以利用献线程池提高线程使用效率(用完后回收)。

newCachedThreadPool();

newFixedThreadPool();

newSingleThreadExecutor();

以上三个方法的返回值为ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或Callable对象代表的线程。

submit();

shutdown();

5、定时器

Timer类:schedule();

TimerTask类:run(); , cancel();

6、练习题

(1)多线程有哪几种实现方式?

三种:继承Thread类,实现Runnable接口,实现Callable接口(结合线程池使用)。

(2)同步有哪几种实现方式?

两种:同步代码块,同步方法。

(3)启动一个线程是run()还是start(),两者的区别是什么?

start()。

run():封装了被线程执行的代码,直接调用,相当于普通方法的调用。

start():启动线程,并由JVM自动调用run()方法。

(4)sleep()和wait()的区别是什么?

sleep():必须指定时间;不释放锁。

wait():可以指定时间,也可以不指定时间;释放锁。

(5)为什么wait()、notify()、notifyAll()都定义在Object类中?

因为这些方法的调用,依赖于锁对象,而同步代码块的锁是任意锁,所以定义在可以代表任意对象的Object类中。

时间: 2024-08-07 00:18:51

大龄屌丝自学笔记--Java零基础到菜鸟--034的相关文章

大龄屌丝自学笔记--Java零基础到菜鸟--017

代码块,继承,this 和 super,方法的重写 1.代码块:使用 “{}” 括起来的代码,称为代码块. 构造代码块:在类中的成员位置,用 “{}” 括起来的代码. 静态代码块:构造代码块+静态修饰符. 局部代码快:局部位置,用于限定变量的生命周期. 1 class Test{ 2 static { 3 System.out.println("静态代码块"); 4 } 5 6 { 7 System.out.println("构造代码块"); 8 } 9 10 pu

大龄屌丝自学笔记--Java零基础到菜鸟--028

泛型,for循环增强应用,静态导入,可变参数,asList() 1.泛型 约束了数据类型,格式为 <数据类型>,如:ArrayList<int> aList=new ArrayList<int>(); 泛型通配符:<?> Object及任意类,<?extends E> E类及其子类,<?super E> E类及其父类. 2.for循环增强应用 1 ArrayList<String> aList=new ArrayList&

大龄屌丝自学笔记--Java零基础到菜鸟--005

关键字,标识符,注释,常量 1.关键字 Java语言具有特定含义的单词,字母全部小写,如:class.public.static.void...... 2.标识符 给接口.类.方法.变量起的名字,如:Fin.main ...... 组成规则:英文字母.数字.$._ ...... 注意事项:不能以数字开头,不能使用关键字,英文字母区分大小写 命名规则:包:小写字母组成,多级包上下级间加 “.” ,如:liverpool(单级包).liverpool.gerrard(多级包) ...... 接口:大

大龄屌丝自学笔记--Java零基础到菜鸟--003

配置环境变量:Path,classpath 1.Path,可以在任意地方执行 “javac.exe” . [计算机]右键[属性]--[高级]选项卡[环境变量]--系统变量[新建],变量名输入 “Java_Home” ,变量值输入JDK安装目录--[确定]. 选择系统变量 “Path” [编辑]--变量值前输入 “%Java_Home%\bin;” --[确定]. 2.classpath,可以在任意地方执行指定目录中的 “.class” 文件. 系统变量[新建],变量名输入 “classpath”

大龄屌丝自学笔记--Java零基础到菜鸟--004

Notepad++下载.安装.设置 1.下载 百度Notepad++,选择百度下载. 2.安装 下载完成后,双击安装文件,下一步傻瓜式安装. 3.设置 启动Nodepad++,[设置]--[首选项]. [首选项]选项卡中,选择[新建],设置 “默认语言” 为 “Java” ,设置 “编码” 为 “ANSI” ,点击[关闭]完成设置,以后可以使用Notepad++编写Java代码.

大龄屌丝自学笔记--Java零基础到菜鸟--001

JDK的下载和安装 1.下载JDK 下载地址:http://www.oracle.com 选择操作系统对应的安装文件. 2.安装JDK 双击启动安装文件,下一步傻瓜式安装,安装路径不要有中文.空格. 安装完成后,win+R,输入“cmd”回车,启动控制台. 直接输入“java”回车,验证是否安装成功. 如图表示安装成功. 3.JDK的卸载 控制面板中卸载.

大龄屌丝自学笔记--Java零基础到菜鸟--002

Hello World 1.进入JDK安装目录下的bin文件夹,新建记事本文件liverpool.txt. 2.在记事本中输入以下代码,并关闭保存. 1 class Fin{ 2 public static void main(String[] args){ 3 System.out.println("Hello World"); 4 } 5 } 3.修改记事本文件后缀名为.java 4.启动控制台,进入该文件夹,输入 “javac liverpool.java” 回车,编译,生成类文

大龄屌丝自学笔记--Java零基础到菜鸟--020

包,权限修饰符,内部类,练习题 1.包 包:package,对类进行分类管理的文件夹. 包的格式:package 包名,多级包用 “.” 隔开,如:package asia.persia . 带包文件的编译:手动创建相应的文件夹:或者编译命令加 “ -d” ,如:javac -d liverpool.java . 访问不同包中的类文件:类文件前加上包的全路径,如:asia.persia.Demo de=new asia.persia.Demo(); . 使用 “import” 关键字导入包. i

大龄屌丝自学笔记--Java零基础到菜鸟--037

类的加载.类加载器.反射 1.类的加载 系统会通过加载.连接.初始化三步来实现类的初始化. 2.类加载器 根类加载器:Bootstrap ClassLoader 扩展类加载器:Extension ClassLoader 系统类加载器:System ClassLoader 3.反射 Class[类]:Constructor[构造方法],Method[成员方法],Field[成员变量].