一、定义
很多人应该对进程,线程,程序这几个概念混淆.程序指什么?简而言之,程序就是代码,用不同语言编写的代码;什么是进程?进程就是表示程序一次完整的执行;线程指的是,在一个进程中,有多个执行链路,每个执行链路就是一个线程.
从概念来说,进程包含多个线程(至少包含一个线程),线程是CPU调度和分配的最小单位.
并行:多个CPU执行不同的任务
并发:一个CPU执行多个不同的任务
二、实现多线程
在jdk1.5之前,有两种方法创建线程:继承Thread,实现Runnable接口
1.继承Thread类
//步骤:
//1.继承Thread类 public class Test extends Thread{ //2.重写run方法,编写要执行的任务 @Override public void run(){ System.out.println("这是用Thread创建的线程"); } //3.创建该类的对象 public static void main(String[] args) { Test t1 = new Test(); //4.调用start()方法启动该线程 t1.start(); }
}
2.实现Runnable接口
步骤:
//1.实现Runnable接口 public class MyRunnable implements Runnable{ //2.重写run方法 @Override public void run() { //实现 System.out.println("这是用Runnable实现的线程"); } public static void main(String[] args) { //3.创建对象 MyRunnable my = new MyRunnable(); //4.封装成Thread,调用它的start方法运行该线程 Thread t1 = new Thread(my); t1.start(); } }
在jdk1.5之后,又增加了两种方法:实现 Callable接口;线程池
3.实现Callable接口
步骤:
//1.实现Callble接口 public class MyCallable implements Callable { //2.重写call方法 @Override public Object call() throws Exception { System.out.println("这是用Callable实现创建对象"); return "callable"; } public static void main(String[] args) { //3.创建对象 MyCallable my = new MyCallable(); //4.创建FutureTask对象,把接口对象传进去 FutureTask task = new FutureTask(my); //5.创建Thread对象,把FutureTask对象传进,调用Thread里的start方法 Thread t1 = new Thread(task); t1.start(); } }
三、总结
1.使用多线程可以更高效地利用CPU资源,同时,让固定流程的程序更加灵活.
2.但是实现多线程就一定快吗?不是的,这需要看CPU的核数.
3.在实现多线程的过程中,相较于继承Thread方法和实现Runnable接口,推荐使用实现Runnable接口来创建线程.原因:实现Runnable接口可以共享同一个对象目标,非常适合多个线程来处理同一个资源.Thread需要用到继承,在java中,继承提高了类的耦合性,父类改变的话,子类大概率也会有影响,跟封装性这个特征相斥.
4.继承Thread类,缺点是该类就不能再继承其他的类;优点是在访问该线程时,可以直接用this关键字来调用.
5.实现Runnable接口,优点是多个线程可以共享同一个对象目标;它的缺点是访问当前线程,必须使用Thread.currentThread()方法
6.实现Callable接口,需要有返回值,且call方法可以抛出异常,而相较于run方法,它不可以抛出异常;在运行Callable任务时可以拿到一个Future对象,通过Future对象可以了解任务执行情况,可取消任务的执行(cancel(true)方法),还可获取执行结果(get()方法)。
标签:Runnable,java,Thread,接口,线程,多线程,public From: https://www.cnblogs.com/pilpill/p/16609795.html