参考3(线程与进程)
参考4(线程池)
1.什么是线程:操作系统能够进行运算调度的最小单位,它被包含再进程中,是进程中的实际运作单位。
2.什么是进程:操作系统分配资源的基本单位,一般情况下,一个运行的程序就可以说是一个进程。
3.为什么使用线程:
1>执行耗时任务。
2>提高CPU的利用率。
4.为什么使用多进程:
1>获取更多的内存分配,分担主进程的内存压力。
2>防止进程被杀死。
5.线程与进程的区别:线程是进程的子集,一个进程可以拥有多个线程,每个线程并行执行不同的任务,
不同的进程使用不同的内存空间,同一进程中的所有线程共享相同的内存空间。
6.优缺点:
1>线程执行开销小,但是不利于资源的管理和保护,线程适合在SMP机器(双CPU系统)上运行。
2>进程执行开销大,但是能够很好的进行资源的管理和保护,进程可以跨机器运行。
7.线程的四种创建方式:
1.继承Thread类创建线程。
2.实现Runnable接口创建线程。
3.使用Callable和Future创建线程。
4.使用线程池。如:Executor框架
2.四种创建线程的实例
方式1:
public class Main {
public static void main(String[] args) {
new MyThread().start();
}
}
class MyThread extends Thread{
@Override
public void run() {
super.run();
System.out.println("戒急、戒躁!");
}
}
方式2:
public class Main1 {
public static void main(String[] args) {
new Thread(new MyThread1()).start();
}
}
class MyThread1 implements Runnable{
@Override
public void run() {
System.out.println("戒急、戒躁!");
}
}
方式3:
public class CallableThreadTest implements Callable<Integer> {
public static void main(String[] args) {
CallableThreadTest ctt=new CallableThreadTest();
FutureTask<Integer> ft=new FutureTask<Integer>(ctt);
for (int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"的循环变量i的值"+i);
if (i==20){
new Thread(ft,"有返回值的线程").start();
}
}
try {
System.out.println("子线程的返回值:"+ft.get());
}catch (InterruptedException e){
e.printStackTrace();
}catch (ExecutionException e){
e.printStackTrace();
}
}
@Override
public Integer call() throws Exception {
int i=0;
for (;i<100;i++){
System.out.println(Thread.currentThread().getName()+"==="+i);
}
return i;
}
}
方式4:
public class ThreadPool {
private static int POOL_NUM=10;
public static void main(String[] args) {
ExecutorService executorService=Executors.newFixedThreadPool(5);
for (int i=0;i<POOL_NUM;i++){
RunnableThread thread=new RunnableThread();
executorService.execute(thread);
}
}
}
class RunnableThread implements Runnable{
private int THREAD_NUM=10;
@Override
public void run() {
for (int i=0;i<THREAD_NUM;i++){
System.out.println("线程"+Thread.currentThread()+" "+i);
}
}
}