进程是一个静态的概念,线程是一个进程里面不同的执行路径。一个CPU只能支持一个线程,真正的多线程是2个CPU以上。
基本概念 |
举例说明
进程,打开任务管理器,下图的一个个程序就是进程
进程再进一步,比如360卫士,一边杀毒一边体检就是两个线程
概念
- 线程是一个程序内部的顺序控制流
- Java的线程是通过java.lang.Thread类来实现的。
- VM启动时会有一个由主方法(public void main(){})所定义的线程
- 可以通过创建Thread的实例来创建新的线程
- 每个线程都是通过某个特定的Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。
- 通过调用Thread类的start()方法来启动一个线程
线程和进程的区别
- 每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销
- 线程可以看成时轻量级的进程,同一类线程共享代码和数据空间,每个线程都有独立的运行栈和程序计数器
- 多进程:在操作系统中能同时运行多个任务(程序)
- 多线程:在同一应用程序中有多个顺序流同时执行
线程的创建和启动 |
创建线程有两种方式
第一种:
- 定义线程类Runnable接口
- Thread myThread=new Thead(target) // target为Runnable接口类型
- Runnable中只有一个方法
- publicvoid run ();用以定义线程运行体
- 使用Runnable接口可以为多个线程提供共享数据
- 在实现Runnable接口的类的run方法定义中可以使用Thread
case:
public class TestThread{ public static void main(String[] args){ Runner r=new Runner(); r.run(); Thread t=new Thread(r); t.start(); for(int i=0;i<100;i++){ System.out.println("Main Thread:------"+i); } } } class Runner implements Runnable{ public void run(){ for(int i=0;i<100;i++){ System.out.println("Runner:"+i); } } }
第二种:
- 可以定义一个Thread的子类并重写其run方法如:
class MyThread extends Thead{ public void run(){} }
- 然后生成该类的对象:
MyThread myThread =new MyThead();
case
public class TestThread{ public static void main(String[] args){ Runner r=new Runner(); r.start(); //Thread t=new Thread(r); //t.start(); for(int i=0;i<100;i++){ System.out.println("Main Thread:------"+i); } } } //class Runner implements Runnable{ class Runner extends Thread{ public void run(){ for(int i=0;i<100;i++){ System.out.println("Runner:"+i); } } }
实现Runnable接口避免多继承局限,接口可调用,体现了共享的概念
还有两种操作多线程的方式
第三种 callable接口
public class Callable{ public static void main(String[] args) throws ExecutionException,InterruptedException{ FutureTask<Integer> futureTask=new FutureTask(new Mythread()); new Thread(futureTask,"A").start(); Integer result=futureTask.get(); System.out.pritln(result); } }
第四种 操纵线程池
通过Executor 的工具类可以创建三种类型的普通线程池:
- FixThreadPool(int n); 固定大小的线程池
- SingleThreadPoolExecutor :单线程池
- CashedThreadPool(); 缓存线程池
public class CeShiDemo { private static ExecutorService executor = Executors.newFixedThreadPool(15); public static void main(String[] args) { for (int i = 0; i < 10; i++) { executor.execute(new SubThread()); } } }
实现Runnable接口
class MyThread implements Runnable { @Override public void run() { try { Thread.sleep(10000); } catch (InterruptedException e) { //do nothing } } }
参考博客:https://blog.csdn.net/qsbbl/article/details/86622144