`
tmj_159
  • 浏览: 705871 次
  • 性别: Icon_minigender_1
  • 来自: 永州
社区版块
存档分类
最新评论

JAVA多线程解惑之实现方式有几种

 
阅读更多

记得刚毕业的时候笔试或者面试通常会出现这样的问题“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的一个强项,面试中可能会讨论线程的创建、同步机制(如synchronized、Lock)、线程安全问题以及并发设计模式。 11. **运算符**: 了解各种运算符的优先级、作用以及特殊用法,如位运算符在处理...

    Java面试解惑系列

    5. **多线程**:了解线程的创建方式(Thread类、Runnable接口)、线程同步机制(synchronized、volatile、Lock接口),以及线程池的使用。 6. **JVM**:JVM的工作原理,类加载机制(双亲委派模型),字节码执行引擎...

    java 解惑,很不错。

    6. **多线程**:线程的基本概念,线程同步与通信(synchronized关键字、wait/notify、Thread.join()等),线程池的使用。 7. **IO流**:输入输出流的分类与使用,包括字符流和字节流,以及NIO(非阻塞I/O)的介绍。...

    Java面试题详解,和一些基础知识的深入剖析,个人认为非常棒

    “JAVA面试题解惑系列(十)——话说多线程”是Java的一个强项。Java提供了丰富的工具和API来处理并发,如Thread类、ExecutorService和synchronized关键字,理解线程安全和死锁等问题是面试的重点。 “JAVA面试题...

    java编程开发指导

    6. **多线程**:Java内置对多线程的支持,通过Thread类或实现Runnable接口可以创建并运行线程。线程间的同步和通信(如synchronized关键字、wait()、notify()方法)是多线程编程中的关键问题。 7. **异常处理**:...

    解决java中的疑惑

    3. **多线程编程**:Java提供了丰富的多线程支持。线程同步(synchronized关键字)、wait/notify机制、线程池(ExecutorService)以及并发集合类(如ConcurrentHashMap)都是学习的重点。 4. **面向对象编程**:...

    【狂神说】JavaSE系列.zip

    6. **多线程**:Java提供了内置的多线程支持,通过Thread类和Runnable接口可以创建和管理线程。理解线程同步、并发控制(如synchronized关键字、wait/notify机制)是进行高性能编程的基础。 7. **反射API**:反射...

    JavaEye论坛热点月报 总第8期

    - **SNA架构的几种实现方式**:探讨了系统网络架构(SNA)的不同实现方式,以及它们在现代网络环境中的应用和优缺点。 4. **项目实战** - **山寨开心网停车外挂开发**:分享了一个基于社交网络游戏的外挂开发案例...

    Netty案例集锦(并发编程篇)有目录

    Netty采用了基于Reactor模式的事件驱动架构,具体包括以下几种模型: - **单线程模型**:适用于简单的低负载应用场景,所有I/O操作由同一个线程完成。 - **多线程模型**:通过多个线程分别处理不同的I/O操作,提高...

Global site tag (gtag.js) - Google Analytics