原创】Java并发编程系列2:线程概念与基础操作
McBye 人气:0
## 【原创】Java并发编程系列2:线程概念与基础操作
> 伟大的理想只有经过忘我的斗争和牺牲才能胜利实现。
本篇为【Dali王的技术博客】Java并发编程系列第二篇,讲讲有关线程的那些事儿。主要内容是如下这些:
- 线程概念
- 线程基础操作
### 线程概念
进程代表了运行中的程序,一个运行的Java程序就是一个进程。在Java中,当我们启动main函数时就启动了一个JVM的进程,而main函数所在的线程就是这个进程中的一个线程,称为主线程。
进程和线程的关系如下图所示:
![file](https://img2020.cnblogs.com/other/923731/202003/923731-20200321230306993-1934490457.jpg)
由上图可以看出来,一个进程中有多个线程,多个线程共享进程的堆的方法区资源,但是每个线程有自己的程序计数器和栈区域。
### 线程基础操作
#### 线程创建与运行
Java中有三种线程创建方式,分别为:继承Thread类并重写run方法,实现Runnable接口的run方法,使用FutureTask方式。
先看继承Thread方式的实现,代码示例如下:
```java:n
public class ThreadDemo {
public static class DemoThread extends Thread {
@Override
public void run() {
System.out.println("this is a child thread.");
}
}
public static void main(String[] args) {
System.out.println("this is main thread.")
DemoThread thread = new DemoThread();
thread.start();
}
}
```
上面代码中DemoThread类继承了Thread类,并重写了run方法。在main函数里创建了一个DemoThread的实例,然后调用其start方法启动了线程。
> tips:调用start方法后线程并没有马上执行,而是处于就绪状态,也就是这个线程已经获取了除CPU资源外的其他资源,等待获取CPU资源后才会真正处于运行状态。
使用继承方式,好处在于通过this就可以获取当前线程,缺点在于Java不支持多继承,如果继承了Thread类,那么就不能再继承其他类。而且任务与代码耦合严重,一个线程类只能执行一个任务,使用Runnable则没有这个限制。
来看实现Runnable接口的run方法的方式,代码示例如下:
```java:n
public class RunnableDemo {
public static class DemoRunnable implements Runnable {
@Override
public void run() {
System.out.println("this is a child thread.");
}
}
public static void main(String[] args) {
System.out.println("this is main thread.");
DemoRunnable runnable = new DemoRunnable();
new Thread(runnable).start();
new Thread(runnable).start();
}
}
```
上面代码两个线程共用一个Runnable逻辑,如果需要,可以给RunnableTask添加参数进行任务区分。在Java8中,可以使用Lambda表达式对上述代码进行简化:
```java:n
public static void main(String[] args) {
System.out.println("this is main thread.");
Thread t = new Thread(() -> System.out.println("this is child thread"));
t.start();
}
```
上面两种方式都有一个缺点,就是任务没有返回值,下面看第三种,使用FutureTask的方式。代码示例如下:
```java:n
public class CallableDemo implements Callable
加载全部内容