小新学Java12-【线程、同步】

 一、线程

1.多线程原理

①随机性打印结果

②多程序内存图解

 2.Thread

Thread类常用方法:

①获取线程名称的方法

获取线程的名称:

1)使用Thread类中的方法getName( )

  string getName()返回该线程的名称。

2)可以先获取到当前正在执行的线程,使用线程中的方法getName()获取线程的名称

  static Thread CurrentThread()返回对当前正在执行的线程对象的引用。

 

设置线程的名称:(了解)
1.使用Thread类中的方法setName(名字)
void setName ( String name)改变线程名称,使之与参数name相同。
2.创建一个带参数的构造方法,参数传递线程的名称;调用父类的带参构造方法,把线程名称传递给父类,让父类(Thread)给子线程起一个名字
Thread ( string name)分配新的Thread 对象。

3.创建线程方式(二)

创建多线程程序的第二种方式:实现Runnable接口
java.Lang.Runnable
Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run的无参数方法。
java.Lang.Thread类的构造方法
Thread ( Runnable target)分配新的Thread 对象。
Thread ( Runnable target,string name)分配新的Thread 对象。
实现步骤:
1.创建一个Runnable接口的实现类
2.在实现类中重写Runnable接口的run方法,设置线程任务
3.创建一个Runnable接口的实现类对象
4.创建Thread类对象,构造方法中传递Runnable接口的实现类对象
5.调用Thread类中的start方法,开启新的线程执行run方法

4.Thread和Runnable的区别

如果一个类继承Thread,则不适合资源共享。但是如果实现了Runnable接口的话,则很容易的实现资源共享。

总结:
实现Runnable接口比继承Thread类所具有的优势:

1)适合多个相同的程序代码的线程去共享同一个资源。

2)可以避免java中的单继承的局限性。

3)增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。

4)线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。

扩充∶在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用java命令执行一个类的时候,实际上都会启动一个JVM,每一个JVM其实在就是在操作系统中启动了一个进程。

5.匿名内部类方式实现线程的创建

匿名内部类方式实现线程的创建

匿名:没有名字
内部类:写在其他类内部的类

匿名内部类作用:简化代码
把子类继承父类,重写父类的方法,创建子类对象合一步完成
把实现类实现类接口,重写接口中的方法,创建实现类对象合成一步完成
匿名内部类的最终产物:子类/实现类对象,而这个类没有名字

格式:
new父类/接口(){
重复父类/接口中的方法
};

二、线程安全

1.线程安全

多线程访问共享的数据,会产生线程安全问题。

实例:

2.线程同步

为了保证每个线程都能正常执行原子操作Java引入了线程同步机制。那么怎么去使用呢?有三种方式完成同步操作︰

①同步代码块。

②同步方法。

③锁机制。

3.同步代码块

解决线程安全问题的一种方案:使用同步代码块
格式:
synchronized(锁对象){
可能会出现线程安全问题的代码(访问了共享数据的代码)
}
注意:
1.通过代码块中的锁对象,可以使用任意的对象
2.但是必须保证多个线程使用的锁对象是同一个
3.锁对象作用:
把同步代码块锁住,只让一个线程在同步代码块中执行

4.同步方法

5.Lock锁

三、线程状态

1.线程状态概述

2.Time Waiting(计时等待)

3.BLOCKED(锁闭塞)

4.Waitting(无限等待)

5.补充知识点

 

posted @ 2022-11-27 14:57  小新好好学Java  阅读(25)  评论(0)    收藏  举报