java之线程创建和启动
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java之线程创建和启动相关的知识,希望对你有一定的参考价值。
线程的创建有三种方法:一是继承Thread类创建线程,二是实现Runnable接口,三是使用Callable和Future创建线程。
继承Thread类创建线程
步骤:
- 定义Thread子类,并重写该类的run方法,run方法代表将要完成的任务,也就是线程执行体
- 创建Thread实例
- 调用Thread子类的start()方法启动线程
1 public class ThreadTest extends Thread{ 2 3 private int i; 4 5 public void run(){ 6 7 for( ;i < 100 ; i++ ) { 8 //getName()返回当前线程的名字 9 System.out.println(getName() + " " + i) ; 10 } 11 12 } 13 14 15 public static void main(String[] args) { 16 17 for(int i = 0; i < 100; i++){ 18 //获取当前线程 19 System.out.println(Thread.currentThread().getName() 20 +" " +i); 21 if(i == 20){ 22 new ThreadTest().start(); 23 new ThreadTest().start(); 24 } 25 } 26 } 27 28 }
实现Runnable接口创建线程
步骤:
- 定义Runnable实现类,并重写该类烦人run方法,该run方法同样是线程执行体》
- 创建Runnable子类的实例,并以此作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象
1 public class ThreadTest implements Runnable{ 2 3 private int i; 4 5 public void run(){ 6 7 for( ;i < 100 ; i++ ) { 8 //当线程实现类用Runnable时,如果要获取当前线程 9 //只能用Thread.currentThread() 10 System.out.println(Thread.currentThread().getName() 11 +" " +i); 12 } 13 14 } 15 16 17 public static void main(String[] args) { 18 19 for(int i = 0; i < 100; i++){ 20 //获取当前线程 21 System.out.println(Thread.currentThread().getName() 22 +" " +i); 23 if(i == 20){ 24 ThreadTest st= new ThreadTest(); 25 //通过new thread(target ,name)创建真正的线程对象 26 new Thread(st, "线程1").start(); 27 new Thread(st, "线程2").start(); 28 } 29 } 30 } 31 32 }
使用callable和Future创建线程
查看 http://blog.csdn.net/ghsau/article/details/7451464
创建线程的三种方式对比
采用实现Runnable、Callable接口的方式创见多线程时,优势是:
线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。
在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
劣势是:
编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。
使用继承Thread类的方式创建多线程时优势是:
编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。
劣势是:
线程类已经继承了Thread类,所以不能再继承其他父类。
以上是关于java之线程创建和启动的主要内容,如果未能解决你的问题,请参考以下文章
java基础之多线程总结一(创建状态synchronized和volatile)
java基础之多线程总结一(创建状态synchronized和volatile)
newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段