跳到正文

【java进阶】线程创建的两种方式

两种线程创建方式的比较第一种方式:继承Thread类实现步骤: 1.自定义类继承Thread 2.覆盖Thread中的run()方法 3.创建该类的对象,调用start()方法,开启线程并调用run方法class MyThread extends Thread{ public void run(){ for (int i = 0; i < 100; i++){ System.out.println("MyThread.run()..."+i); } /*单条线程运行一百次*/ } } public class test1{ public static void main (String args){ MyThread a = new MyThread(); a.start(); for (int j = 0; j < 100; j++){ System.out.println("test1.main()----"+j); } } }第二种方式:实现Runnable接口 实现步骤: 1.定义一个实现Runnable接口的类 2.覆盖run方法 3.创建该类对象,并以该类对象为参数创建Thread类的对象,从而创建了一个线程 4.调用start方法,开启线程并调用run方法。class MyThread implements Runnable{ public void run (){ for (int i = 0; i < 50; i++){ System.out.println("MyThread.run()..."+i); } /*每条线程运行50次,共200次*/ } } public class test1{ public static void main (String args){ MyThread a = new MyThread(); Thread a1 = new Thread(a); Thread a2 = new Thread(a); Thread a3 = new Thread(a); Thread a4 = new Thread(a); a1.start(); a2.start(); a3.start(); a4.start(); } }public class test1{ public static void main(String args){ MyThread m=new MyThread(); Thread t1=new Thread(m,"Thread 1"); Thread t2=new Thread(m,"Thread 2"); Thread t3=new Thread(m,"Thread 3"); t1.start(); /*共运行一百次, 三条线程哪条抢到资源就运行哪条 */ t2.start(); t3.start(); } } class MyThread implements Runnable{ private int i=0; public void run(){ while(i<100){ i++; System.out.println(i+" MyThread.run "+Thread.currentThread().getName()); } } }如果现实问题中要求必须创建多个线程来执行同一任务,而且这多个线程之间还将共享同一个资源,那么就可以使用实现Runnable接口的方式来创建多线程程序。而这一功能通过扩展Thread类是无法实现的。 实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,从而特别适合多个具有相同代码的线程去处理同一资源的情况。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。总结: 采用继承Thread类方式: (1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。 (2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。采用实现Runnable接口方式: (1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。 (2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。

评论

填写昵称与邮箱即可评论,无需登录。

推荐阅读