再谈 Java中Runnable和Thread的区别
在面试中老有面试官问这个问题,个人觉得这个问题问的没有技术,一个死记硬背就能回答的很好。但是更深的回答是什么了,那就是直接回答源码吧。 thread类实现了runnable 接口 ,Runnable就是一个借口 ,只能我们去实现了才能用 对吧,不管是普通类 还是匿名内部类 ,最大的区别是我们的自己的实现类 没有办法启动线程,还是要借助于thread
结果就出现了线程的实现方法
package test8;/*** 方式一* @author suifeng**/
class myThread extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println(Thread.currentThread());}
}/*** 方式二* @author suifeng**/
class myRunable implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println(Thread.currentThread());}
}
public class DT {public static void main(String[] args) {// TODO Auto-generated method stubnew myThread().start();new Thread(new myRunable()).start();}}
但是不管是什么方法都需要 thread类的start 方法告诉JVM 启动线程 ,start()方法被 synchronized 修饰 ,在方法块里面有调用了start0() 方法
public synchronized void start() {/*** This method is not invoked for the main method thread or "system"* group threads created/set up by the VM. Any new functionality added* to this method in the future may have to also be added to the VM.** A zero status value corresponds to state "NEW".*/if (threadStatus != 0)throw new IllegalThreadStateException();/* Notify the group that this thread is about to be started* so that it can be added to the group's list of threads* and the group's unstarted count can be decremented. */group.add(this);boolean started = false;try {start0();started = true;} finally {try {if (!started) {group.threadStartFailed(this);}} catch (Throwable ignore) {/* do nothing. If start0 threw a Throwable thenit will be passed up the call stack */}}}
private native void start0();
start0方法是一个native 方法,直接调用的JVM C语言方法,才能启动一个线程 ,所以只有我们有办法启动这个start0,就可以自己创建一个线程 但是他又是一个私有方法 好吧,先我们来东东手,以后再也不用老是在实现runnable和在start()了
package test8;import java.lang.Thread.State;
import java.lang.Thread.UncaughtExceptionHandler;interface Work {void work();
}/*** 装饰模式 * @author suifeng**/
class Mthread implements Runnable {Thread dt;Work w;public Mthread(Work w) {dt = new Thread(this);this.w = w;dt.start();}public int hashCode() {return dt.hashCode();}public boolean equals(Object obj) {return dt.equals(obj);}public void start() {dt.start();}// ...public void run() {w.work();}public final void stop() {dt.stop();}public final void stop(Throwable obj) {dt.stop(obj);}public void interrupt() {dt.interrupt();}public boolean isInterrupted() {return dt.isInterrupted();}public void destroy() {dt.destroy();}public final boolean isAlive() {return dt.isAlive();}public final void suspend() {dt.suspend();}public final void resume() {dt.resume();}public final void setPriority(int newPriority) {dt.setPriority(newPriority);}public final int getPriority() {return dt.getPriority();}public final void setName(String name) {dt.setName(name);}public final String getName() {return dt.getName();}public final ThreadGroup getThreadGroup() {return dt.getThreadGroup();}public int countStackFrames() {return dt.countStackFrames();}public final void join(long millis) throws InterruptedException {dt.join(millis);}public final void join(long millis, int nanos) throws InterruptedException {dt.join(millis, nanos);}public final void join() throws InterruptedException {dt.join();}public final void setDaemon(boolean on) {dt.setDaemon(on);}public final boolean isDaemon() {return dt.isDaemon();}public final void checkAccess() {dt.checkAccess();}public String toString() {return dt.toString();}public ClassLoader getContextClassLoader() {return dt.getContextClassLoader();}public void setContextClassLoader(ClassLoader cl) {dt.setContextClassLoader(cl);}public StackTraceElement[] getStackTrace() {return dt.getStackTrace();}public long getId() {return dt.getId();}public State getState() {return dt.getState();}public UncaughtExceptionHandler getUncaughtExceptionHandler() {return dt.getUncaughtExceptionHandler();}public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) {dt.setUncaughtExceptionHandler(eh);}
}public class DthredTest {public static void main(String[] args) {new Mthread(new Work() {@Overridepublic void work() {System.out.println(Thread.currentThread());}});new Mthread(new Work() {@Overridepublic void work() {// TODO Auto-generated method stubSystem.out.println(Thread.currentThread());}});while (Thread.activeCount() > 1) {Thread.yield();}}
}
再谈 Java中Runnable和Thread的区别相关推荐
- Java中Runnable和Thread的区别
2019独角兽企业重金招聘Python工程师标准>>> 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.la ...
- java中Runnable和Callable的区别
文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...
- java中runnable_Java中Runnable和Thread的区别
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...
- 再谈Java中的覆盖(Overriding)与重载(Overloading)
在 Overriding vs Overloading in Java 中,我们简单介绍了Java中的Overriding 与 Overloading ,下面我们就此话题继续探讨: 问题一:什么是静态 ...
- 浅谈java中extends与implements的区别
Extends可以理解为全盘继承了父类的功能.implements可以理解为为这个类附加一些额外的功能:interface定义一些方法,并没有实现,需要implements来实现才可用.extend可 ...
- JVM系列之:再谈java中的safepoint
文章目录 safepoint是什么 safepoint的例子 线程什么时候会进入safepoint safepoint是怎么工作的 总结 safepoint是什么 java程序里面有很多很多的java ...
- 再谈Java中的引用
在JDK1.2之后,Java对引用进行了扩充,将引用分为强引用.软引用.弱引用和虚引用,这4中引用的强度依次减弱,这里说的引用强度是指引用关联的对象在发生垃圾回收之后是否还存在,具体如下: 强引用类似 ...
- file相对路径java_浅谈java 中文件的读取File、以及相对路径的问题
一.对于java项目中文件的读取 1.使用system 或是 系统的properties对象 ①直接是使用 string relativelypath=system.getproperty(" ...
- java中的static类_再议Java中的static关键字
再议Java中的static关键字 java中的static关键字在很久之前的一篇博文中已经讲到过了,感兴趣的朋友可以参考:<Java中的static关键字解析>. 今天我们再来谈一谈st ...
最新文章
- RCP开发小技巧(二)
- 让DB2数据库更牢靠
- 检查CentOS7定时任务是否启用并执行过
- 从 Nginx、Apache 工作原理看为什么 Nginx 比 Apache 高效!
- Jinja2模板与模板继承
- 品高云入围央采软件协议供货名单
- Chatbot ⾖瓣电影爬⾍简析
- ios中怎么样调节占位文字与字体大小在同一高度
- 阿里P8手把手教你!java私塾培训
- android 日历折叠,可折叠的日历控件Calendar
- jspx框架使用总结-页面开发
- MTK 11A MAINMENU
- 重启MySQL报Unit mysqld.service could not be
- 永洪科技怎么样_【永洪科技工资|永洪科技待遇怎么样】-看准网
- Winserver2016安装Exchange2016总结(一堆坑)
- python word修改神器docxtpl
- C++:亲戚(relation)
- 无需转动魔方即可判断魔方拼装错误的完整方法
- nexus2.5版本升级到nexus2.14(同时升级到nexus3.24版本)版本
- 台式电脑计算机风机,笔记本冷却风扇与台式计算机CPU风扇的质量,类型和区别...