在学习Java多线程之前,需要先了解以下基本概念。
基本概念
- 进程
进程是程序的一次执行过程,是资源分配的基本单位,有独立的内存空间。 - 线程
线程是调度执行的基本单位,是程序的一条执行路径。 - 并行
多个处理器同时执行任务,是真正的同时进行,如4核cpu可以同时处理4个任务。 - 并发
单个处理器通过调度算法,间断地切换并执行多个任务,由于时间片很短,看起来像是同时执行,是逻辑上的同时。
为什么使用多线程
- 线程是cpu调度执行的基本单位,使用多线程可以抢占更多的时间片,获得更多的执行机会。
- 单线程情况下按顺序执行逻辑,在处理用时较久的任务时下面的代码会被阻塞,可能造成卡顿。可以新建线程把耗时的操作放到线程独立执行,不会阻塞主线程的执行。
Java怎么创建线程
Java创建线程主要有以下三种方法。
- 继承Thread类,代码如下:
public class ThreadTest extends Thread{
@Override
public void run() {
System.out.println(getName()+"do something");
}
public static void main(String[] args) {
Thread t1 = new ThreadTest();
t1.start();
}
}
- 实现Runnable接口
import java.util.Currency;
public class RunnableTest implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"do something");
}
public static void main(String[] args) {
Runnable rt = new RunnableTest();
Thread t1 = new Thread(rt);
}
}
- 实现Callable接口
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableTest implements Callable {
@Override
public Object call() throws Exception {
System.out.println(Thread.currentThread().getName()+"do something");
return Thread.currentThread().getName()+"return something";
}
public static void main(String[] args) {
Callable ct = new CallableTest();
FutureTask futureTask = new FutureTask(ct);
Thread t1 = new Thread(futureTask);
t1.start();
try {
Thread.sleep(1000);
System.out.println(futureTask.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
run和start的区别
run方法只是一个普通的成员方法,定义线程启动时干的事。直接调用run方法会在当前线程执行,调用start方法会启动新线程执行run方法中的代码。
选择Thread,Runnable还是Callable
继承Thread和实现Runnable能实现同样的效果,但因为Java单继承多实现的特点,一般选择实现Runnable接口。
Callable是jdk1.5后出的,之前的两种创建线程的方法都无法返回结果,使用Callable能返回结果。