[本博客记录与Kali Linux]
无论哪种方式创建线程,最底层都是实现
Runnable
接口
Thread
类实现了Runnable
接口,因此继承Thread
就相当于实现了Runnable
Runnable
…就是实现了Runnable
接口FutureTask
类实现了RunnableFuture
接口,而RunnableFuture
继承了Runnable
接口- 线程池,每次构建线程是都是
Worker
类,而Worker
类实现了Runnable
继承Thread类,然后直接run
class T extends Thread{
@Override
public void run(){
System.out.println("创建了一个新的线程");
}
}
public class M{
public static void main(String[] args){
T t = new T();
t.run();
}
}
public class R implements Runnable{
@Override
public void run(){
System.out.println("创建了一个新的线程");
}
}
public class M{
public static void main(String[] args){
R r = new R();
Thread T = new Thread(r);
r.start();
}
}
public class C implements Callable{
@Override
public Object call(0 throws Exception{
System.out.println("创建了一个新的线程,并且返回1;")
return 1;
}
}
public class M{
public static void main(String[] args) throws ExecutionException,InterruptedException{
C callable = new C();
FutureTask futureTask = new FutureTask(callable);
Thread t = new Thread(futureTask);
t.start();
Object i = futureTask.get();
System.out.println("返回值为:"+i);
}
}
Thread t = new Thread(()->{
System.out.println("创建了新的线程");
});
### 5. 基于线程池构造线程
```java
......
在Java中,Java给我们提供了6种线程状态,见下方源码:
new --> ready --> running --> wait/sleep/join()
|__ Terminated
// 源码
public enum State{
NEW, // 创建线程
RUNNABLE, //就绪状态
BLOCKED, // 等待(一般只有拿synchronized的时候才会出现这种状态)
WAITING, // 等待(手动唤醒)
TIMED_WAITING, // 时间等待(时间结束后自动唤醒)
TERMINATED; // 结束
}
1.
stop
方法,强制线程结束(不推荐)
2.interrupt
方法
3.使用共享变量
interrupt
方式// 默认interrupt是false
Thread.currentThread().isInterrupted(); // 获取中断标记位的状态
Thread.currentThread().interrupt(); //标记从false变为true,中断线程
Thread.currentThread().interrupted(); //获取状态后将状态重新变为默认的false状态
static volatile boolean flag = true;
public static void main(String[] args) throws InterruptedException{
Thread t1 = new Thread(()->{
while(flag){
// 处理任务
}
});
t1.start();
}
sleep
属于Thread类的静态方法,而wait
是属于Object的,任何对象都可以执行sleep
属于TIME_WAITING,会被自动唤醒,而wait()
方法需要被手动唤醒sleep
方法在持有锁时,执行不会释放锁资源,wait方法必须在持有锁时候才可以执行
3.1wait
方法会将持有锁的线程从owner扔到WaitSet集合中,这个操作实在修改ObjectMonitor对象,如果没有持有synchronized的话,是无法操作ObjectMonitor对象的。
- 原子性
- 可见性
- 有序性
JMM(Java Memory Model)。不同的硬件和不同的操作系统字啊内存上的操作有一定差异,因此Java为了解决相同代码在不同操作系统上的各种问题,用JMM屏蔽掉各种硬件和操作系统的差异,以让Java的并发编程可以做到跨平台。
JMM规定所有变量都会存储在主内存中,在操作的时候,需要从主内存中复制一份到线程内存(CPU内存),在线程内部做计算,然后再写回主内存中。
原子性:只一个操作是不可分割、不可中断的,一个线程在执行时候,另一个线程是不会影响到他的。