本文章内容整理自:张孝祥_Java多线程与并发库高级应用视频教程
线程简单来讲就是程序正在做的事情。多线程即一个程序同时做多件事情,一个线程就是一件事情。
在java中创建线程的方法有两种。
方法一是直接重写Thread对象的run方法。代码如下:
//重写Thread类的run方法 Thread thread = new Thread(){ @Override public void run() { while (true) { try { Thread.sleep(1000);//线程休眠1秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread"+Thread.currentThread().getName());//打印当前线程的名字 } } }; thread.start();
方法二是创建Runnable对象,重写其的run方法,然后传入Thread对象。
//重写Runnable类的run方法,传入Thread对象 Thread thread2 = new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(1000);//线程休眠1秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Runnable:"+Thread.currentThread().getName());//打印当前线程的名字 } } }); thread2.start();
这两种方法在效果上没有区别,不过当一个Thread对象既重写了run方法,又传入了Runnable对象时,结果会执行哪个run方法里的代码呢?
答案是,会执行Thread对象重写过的run方法里的代码。
为什么会这样呢?
翻看java源代码可以找到答案。
在Thread类中,run方法是这样实现的:
@Override public void run() { if (target != null) { target.run(); } }
其中的target是一个Runnable对象。
也就是说,只有当Thread对象去实现父类的run方法时,才会使用Runnable对象。假如Thread对象自己实现了run方法,那么父类的run方法相当于作废,自然也就出现了上文提到的结果。