首先我要说的是程序,进程,线程。多线程真对的是多cpu而言,但是单cpu也可以实现,原因就是cpu运行是内存的100倍,cpu运行的很快这时候就能进行时间片轮换线程,让你看起来像是多个线程并行。
多线程就会说的有几种实现多线程的方法,可以说两种,也可以说是4种?
两种创建一个子类对 Thread继承,然后重写run的方法,调用start方法,实现
实现Runnable接口,实现run方法,创建对象,把对象当成参数传入Thread类的构造器中,调用Thread中的start方法。
Thread也是对Runnable接口的实现,run方法。
第三种,实现Callable接口,和Runnable接口比Callable接口更强大,可以有返回值。实现的是call方法,不是run方法,可以抛出异常,支持泛型的返回值,需要借助FutureTask类
四种,使用线程池。
提高响应速度(减少了创建新线程的时间)降低资源消耗(重复利用线程池中线程,不需要每次都创建)便于线程管理
//方式一
class ThreadTest extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
// 方式二
class RunnableTest implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
// 方式三
class CallableTest implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
sum += i;
}
return sum;
}
}
// 方式四
class ThreadPool implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
public class Test {
public static void main(String[] args) {
// 继承Thread
ThreadTest thread = new ThreadTest();
thread.setName("方式一");
thread.start();
// 实现Runnable
RunnableTest runnableTest = new RunnableTest();
Thread thread2 = new Thread(runnableTest, "方式二");
thread2.start();
// 实现Callable<> 有返回值
CallableTest callableTest = new CallableTest();
FutureTask<Integer> futureTask = new FutureTask<>(callableTest);
new Thread(futureTask, "方式三").start();
// 返回值
try {
Integer integer = futureTask.get();
System.out.println("返回值(sum):" + integer);
} catch (Exception e) {
e.printStackTrace();
}
// 线程池
ExecutorService pool = Executors.newFixedThreadPool(10);
ThreadPoolExecutor executor = (ThreadPoolExecutor) pool;
/*
* 可以做一些操作:
* corePoolSize:核心池的大小
* maximumPoolSize:最大线程数
* keepAliveTime:线程没任务时最多保持多长时间后会终止
*/
executor.setCorePoolSize(5);
// 开启线程
executor.execute(new ThreadPool());
executor.execute(new ThreadPool());
executor.execute(new ThreadPool());
executor.execute(new ThreadPool());
}
}
他们直接的关系还可以进一步理解。