Java线程

文章详细介绍了Java中创建线程的四种方式,包括继承Thread类、实现Runnable接口、使用Callable和FutureTask以及Lambda表达式。同时,讨论了线程的状态转换,如NEW、RUNNABLE、BLOCKED等,并提出了结束线程的策略,如interrupt方法和共享变量。此外,文章还对比了wait和sleep的区别,并强调了并发编程的三大特性:原子性、可见性和有序性。
摘要由CSDN通过智能技术生成

Java线程

[本博客记录与Kali Linux]

线程的创建方式

无论哪种方式创建线程,最底层都是实现Runnable接口

  1. Thread类实现了Runnable接口,因此继承Thread就相当于实现了Runnable
  2. Runnable…就是实现了Runnable接口
  3. FutureTask类实现了RunnableFuture接口,而RunnableFuture继承了Runnable接口
  4. 线程池,每次构建线程是都是Worker类,而Worker类实现了Runnable

1. 继承Thread类

继承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();
	}
}

2. 实现Runable接口

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();
	}
}

3. 实现Callable,配合FutureTask实现返回值

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);
	}
}

4. 基于Lambda方式

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.使用共享变量

2.interrupt方式

// 默认interrupt是false
Thread.currentThread().isInterrupted(); // 获取中断标记位的状态
Thread.currentThread().interrupt(); //标记从false变为true,中断线程
Thread.currentThread().interrupted(); //获取状态后将状态重新变为默认的false状态

3. 使用共享变量

static volatile boolean flag = true;
public static void main(String[] args) throws InterruptedException{
	Thread t1 = new Thread(()->{
		while(flag){
			// 处理任务
		}
	});
	t1.start();
}

Java线程中wait与sleep的区别

  1. sleep属于Thread类的静态方法,而wait是属于Object的,任何对象都可以执行
  2. sleep属于TIME_WAITING,会被自动唤醒,而wait()方法需要被手动唤醒
  3. sleep方法在持有锁时,执行不会释放锁资源,wait方法必须在持有锁时候才可以执行
    3.1 wait方法会将持有锁的线程从owner扔到WaitSet集合中,这个操作实在修改ObjectMonitor对象,如果没有持有synchronized的话,是无法操作ObjectMonitor对象的。

并发编程的三大特性

  1. 原子性
  2. 可见性
  3. 有序性

1. 原子性

JMM(Java Memory Model)。不同的硬件和不同的操作系统字啊内存上的操作有一定差异,因此Java为了解决相同代码在不同操作系统上的各种问题,用JMM屏蔽掉各种硬件和操作系统的差异,以让Java的并发编程可以做到跨平台。
JMM规定所有变量都会存储在主内存中,在操作的时候,需要从主内存中复制一份到线程内存(CPU内存),在线程内部做计算,然后再写回主内存中。
原子性:只一个操作是不可分割、不可中断的,一个线程在执行时候,另一个线程是不会影响到他的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值