记得刚毕业的时候笔试或者面试通常会出现这样的问题“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的一个强项,面试中可能会讨论线程的创建、同步机制(如synchronized、Lock)、线程安全问题以及并发设计模式。 11. **运算符**: 了解各种运算符的优先级、作用以及特殊用法,如位运算符在处理...
关于“多线程”,文章探讨了Java中多线程编程的相关知识。包括如何创建线程、线程的生命周期、线程同步机制、线程池以及并发工具类等。 最后,文章提到了一些运算符的相关知识,比如算术运算符、关系运算符、逻辑...
5. **多线程**:了解线程的创建方式(Thread类、Runnable接口)、线程同步机制(synchronized、volatile、Lock接口),以及线程池的使用。 6. **JVM**:JVM的工作原理,类加载机制(双亲委派模型),字节码执行引擎...
6. **多线程**:线程的基本概念,线程同步与通信(synchronized关键字、wait/notify、Thread.join()等),线程池的使用。 7. **IO流**:输入输出流的分类与使用,包括字符流和字节流,以及NIO(非阻塞I/O)的介绍。...
“JAVA面试题解惑系列(十)——话说多线程”是Java的一个强项。Java提供了丰富的工具和API来处理并发,如Thread类、ExecutorService和synchronized关键字,理解线程安全和死锁等问题是面试的重点。 “JAVA面试题...
6. **多线程**:Java内置对多线程的支持,通过Thread类或实现Runnable接口可以创建并运行线程。线程间的同步和通信(如synchronized关键字、wait()、notify()方法)是多线程编程中的关键问题。 7. **异常处理**:...
3. **多线程编程**:Java提供了丰富的多线程支持。线程同步(synchronized关键字)、wait/notify机制、线程池(ExecutorService)以及并发集合类(如ConcurrentHashMap)都是学习的重点。 4. **面向对象编程**:...
6. **多线程**:Java提供了内置的多线程支持,通过Thread类和Runnable接口可以创建和管理线程。理解线程同步、并发控制(如synchronized关键字、wait/notify机制)是进行高性能编程的基础。 7. **反射API**:反射...
- **SNA架构的几种实现方式**:探讨了系统网络架构(SNA)的不同实现方式,以及它们在现代网络环境中的应用和优缺点。 4. **项目实战** - **山寨开心网停车外挂开发**:分享了一个基于社交网络游戏的外挂开发案例...
Netty采用了基于Reactor模式的事件驱动架构,具体包括以下几种模型: - **单线程模型**:适用于简单的低负载应用场景,所有I/O操作由同一个线程完成。 - **多线程模型**:通过多个线程分别处理不同的I/O操作,提高...