线程
概念
线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
创建
public class ThreadTest {
public static void main(String[] args) {
Thread thread = new Thread(){
public void run(){
System.out.println("Thread Running!");
}
};
thread.start();
}
}
1. 继承Thread类,重写run();
创建线程只需要继承Thread类,然后在run方法里写下线程要实现的任务即可
//继承Thread类,重写run()
public class MyThread extends Thread{
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread thread = new MyThread();
thread.start();
Thread thread2 = new Thread(new MyThread());
thread2.start();
}
//重写run()方法
public void run() {
System.out.println("MyThread running!");
}
}
2. 实现Runnable接口,重写run()
//实现Runnable接口,重写run()
public class MyRunnable implements Runnable {
public void run(){
System.out.println("MyRunnable running!");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread thread = new Thread(new MyRunnable());
thread.start();
}
}
3. Callable接口
步骤:
- 定义一个class实现Callable接口;
- 重写call();
- 创建FutureTask的对象;
- 创建Thread的对象;
- 启动线程;thread.start();
- 可通过FutureTask类的get()方法获得线程执行结束后的返回值,即call的返回值。futuretask.get();
//Callable接口只包含抽象方法V call()
public class Thread_Callable {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
FutureTask<String> futuretask = new FutureTask<String>(new CallableImpl());
Thread thread = new Thread(futuretask);
thread.start();
try {
System.out.println(futuretask.get());
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
class CallableImpl implements Callable<String> {
public String call() throws Exception {
return "Thread_Callable!";
}
}
4. 通过线程池来创建线程
步骤
- 实现Callable接口,重写call()方法
- 定义线程池
- 利用submit()方法提交任务;
- 利用FutureTask类get()方法获取返回值
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
//通过线程池来创建线程
public class ThreadPool {
public static void main(String[] args) throws InterruptedException, ExecutionException {
// TODO Auto-generated method stub
/*
ThreadPoolExecutor(int corePoolSize, 核心线程数
int maximumPoolSize, 最大线程数
long keepAliveTime, 线程空闲时间
TimeUnit unit, 参数keepAliveTime的时间单位,共7种取值,{
TimeUnit.DAYS; //天
TimeUnit.HOURS; //小时
TimeUnit.MINUTES; //分钟
TimeUnit.SECONDS; //秒
TimeUnit.MILLISECONDS; //毫秒
TimeUnit.MICROSECONDS; //微妙
TimeUnit.NANOSECONDS; //纳秒
}
BlockingQueue<Runnable> workQueue) 阻塞队列
*/
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200,
TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(20));
Future task = executor.submit(new CallableImpl());
System.out.println(task.get());
executor.shutdown();
}
}
class RunnableImpl implements Runnable {
public void run() {
System.out.println("ThreadPool Running!");
}
}