线程
线程是进程中的一个实体,本身是不会独立存在的,操作系统在分配资源的时候是把资源分配给进程的,但是CPU资源比较特殊,被分配到线程中了,因为真正要占用CPU运行的是线程,所以也说线程是CPU分配的基本单位
一个进程有多个线程,这些线程共享进程的堆和方法区资源,但是每个线程都有自己独立的程序计数器和栈区域
在JAVA中,当我们启动main函数的时候,其实就启动了一个JVM的进程,而main函数所在的线程就是这个进程中的一个线程,也称主线程
线程的创建
JAVA中创建线程三种方式,分别为实现Runnable接口的run方法,继承Thread类并重写run方法,使用FutureTask方式
1、继承Thread
public class ThreadTest extends Thread {
@Override
public void run() {
System.out.println("使用继承Thread方式创建线程");
}
public static void main(String[] args) {
//创建线程
ThreadTest threadTest=new ThreadTest();
//运行线程
threadTest.start();
}
}
2、实现Runnable接口 public class MyRunable implements Runnable {
@Override
public void run() {
System.out.println("线程的第二种创建方式,实现Runnable");
}
public static void main(String[] args) {
//创建
MyRunable runable=new MyRunable();
//启动
new Thread(runable).start();
}
}
3、使用FutureTask方式
public class CallerTask implements Callable<String> {
@Override
public String call() throws Exception {
return "hello";
}
public static void main(String[] args) throws Exception{
//创建异步任务
FutureTask<String> futureTask=new FutureTask<>(new CallerTask());
//启动线程
new Thread(futureTask).start();
//等待任务执行完毕,并返回执行结果
String result=futureTask.get();
System.out.println(result);
}
}
三种方式的区别
1、使用继承Thread方法的好处,在run()方法内部可以使用this直接获取当前的线程,不好的地方在于java只能单继承,如果继承了Thread类,就不能在继承其他类,另外任务和代码没有分离,当多个线程执行一样任务的时候需要多份任务代码
2、实现runnable接口,多个线程可以执行一样任务,如果需要可以给线程类添加参数进行业务区分,另外,实现Runnable接口之后,还可以继承实现其他类和接口
3、以上两种方式都有一个缺点,就是没有返回值,而使用FutureTask方式是可以有返回值的,不同的是先要创建异步任务,然后启动执行返回数据
原文:https://www.cnblogs.com/jisha/p/14634975.html