通常创建线程有两种方式1.继承Thread类并重写run方法publicclassThreadDemoextendsThread{@Overridepublicvoidrun(){System.out.println("创建线程方式1");}publicstaticvoidmain(String[]args){ThreadDemothreadDemo=newThreadDemo();threadDemo.start();}}2.实现Runnable接口(Runnbale中只有一个run方法),重写run方法。然后将该实例作为参数传入Thread的构造函数中publicclassThreadDemoimplementsRunnable{@Overridepublicvoidrun(){System.out.println("创建线程方法2");}publicstaticvoidmain(String[]args){ThreadDemothreadDemo=newThreadDemo();//分析源码newThread(threadDemo).start();.threadDemo在构造函数中作为参数传递给线程3中的target属性,在执行线程的run方法时,target(threadDemo)执行子类重写的run方法,实现业务逻辑publicThread(Runnabletarget){init(null,target,"Thread-"+nextThreadNum(),0);}//只显示部分代码privatevoidinit(ThreadGroupg,Runnabletarget,Stringname,longstackSize,AccessControlContextacc,booleaninheritThreadLocals){if(name==null){thrownewNullPointerException("namecannotbenull");}这个名字=名字;SecurityManager安全=System.getSecurityManager();这个.group=g;this.priority=parent.getPriority();**this.target=目标;**}@Overridepublicvoidrun(){if(target!=null){target.run();无论哪种方式创建线程,本质都是实现Runnable接口重写run方法,直接调用run方法,不属于多线程Java线程的创建和调用过程,如图上图。首先,Java线程的start方法会创建一个本地线程(通过调用JVM_StartThread)。这个线程的thread函数是jvm.cpp中定义的thread_entry,会进一步调用run方法。可见Java线程的run方法与普通方法没有本质区别。直接调用run方法不会报错,但是会在当前线程中执行,不会创建新线程。4、FutureTask,Callable,FutureTask也可以创建线程,并且可以获取返回值FutureTask实现了Runnable接口重写run方法,可以作为参数传递给Thread的构造函数。实现了Future接口,可以通过get()和cancel()获取返回值来取消线程。publicclassFutureTaskDemoimplementsCallable
