记得刚毕业的时候笔试或者面试通常会出现这样的问题“JAVA多线程有几种实现方式”,于是果断写下有两种,继承Thread抽象类或者实现Runnable接口。
但是当我们真正的观察Thread类的时候发现其实Thread也继承Runnable接口
public class Thread implements Runnable{ ......
Runnable 接口更加简单,留下一个抽象方法之后就不负责任了。
public interface Runnable { public abstract void run(); }
考虑到上面问题,那我们可以不可以直接说,实现多线程的方式只有一种,那就是实现Runnable接口呢。
这个问题没有答案,因为从继承和实现的角度来说是对的,但是,如果只实现一个Runnable接口就是一个多线程了那么多线真的太简单了。
还记得实现Runnable之后还要做什么吗?需要把这个对象作为参数放入Thread类中,然后调用start方法。
new Thread(new MyRunnable()).start();
所以说没有Thread类,就算你实现了Runnable()接口之后这个类也不过是个普通的类而已。
我们仔细看Thread类发现,多线程的逻辑都在这个类中,当然里面还有很多内部类和本地方法(JNI)。
因为里面关键的代码都是JNI的所以我们无法从源代码中知道更多的信息。
重要点的方法有两个,一个是构造方法中调用的初始化方法
private void init(ThreadGroup threadgroup, Runnable runnable, String s, long l) { if(s == null) throw new NullPointerException("name cannot be null"); Thread thread = currentThread(); SecurityManager securitymanager = System.getSecurityManager(); if(threadgroup == null) { if(securitymanager != null) threadgroup = securitymanager.getThreadGroup(); if(threadgroup == null) threadgroup = thread.getThreadGroup(); } threadgroup.checkAccess(); if(securitymanager != null && isCCLOverridden(getClass())) securitymanager.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION); threadgroup.addUnstarted(); group = threadgroup; daemon = thread.isDaemon(); priority = thread.getPriority(); name = s.toCharArray(); if(securitymanager == null || isCCLOverridden(thread.getClass())) contextClassLoader = thread.getContextClassLoader(); else contextClassLoader = thread.contextClassLoader; inheritedAccessControlContext = AccessController.getContext(); target = runnable; setPriority(priority); if(thread.inheritableThreadLocals != null) inheritableThreadLocals = ThreadLocal.createInheritedMap(thread.inheritableThreadLocals); stackSize = l; tid = nextThreadID(); }
另外一个是调用start()的时候
public synchronized void start() { boolean flag; if(threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); flag = false; start0(); flag = true; try { if(!flag) group.threadStartFailed(this); } catch(Throwable throwable) { } break MISSING_BLOCK_LABEL_70; Exception exception; exception; try { if(!flag) group.threadStartFailed(this); } catch(Throwable throwable1) { } throw exception; } private native void start0();
相关推荐
java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号 java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号
多线程两种实现方式Java,MLDN,实训课程中的多线程
java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...
Java多线程读大文件 java多线程写文件:多线程往队列中写入数据
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
Java多线程实现异步调用实例。运行Main可以看到结果。main是主线程,另有A,B,C三个线程用不同的时间跑完。
java多线程实现大批量数据切分成指定份数的数据,然后多线程处理入库或者导出,线程的个数和每份数据的数量都可以控制
java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题
java一些简单的多线程用法,适合初学者
1、Java有两种实现多线程的方式:通过Runnable接口、通过Thread直接实现,请掌握这两种实现方式,并编写示例程序。 2、多线程是并发执行的,交替占有cpu执行,请编写示例程序,并观察输出结果。 3、采用线程同步方法...
Java多线程实现数据切割批量执行,实现限流操作。 java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。...
java多线程实现TCP连接UDP聊天的聊天程序
多线程是实现多任务的一种方式。 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。 “同时”执行是人的...
1. SpringBoot 自定义线程池以及多线程间的异步调用(@Async、@EnableAsync) 2.Java多线程之定时任务 以及 SpringBoot多线程实现定时任务 3.@EnableScheduling 与 @Scheduled
该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!
java多线程实现生产者和消费者
java多线程Socket简单实现
Java多线程实现.pdf
一个java 多线程操作数据库应用程序!!!
详细的讲解了java多线程的原理,并配有代码进行实战,适合java初学者和想对多线程有进一步了解的人。