`

Concurrent - 多线程

 
阅读更多

原创转载请注明出处:http://agilestyle.iteye.com/blog/2356830

 

Java中有几种方法可以实现一个线程?

  • 继承Thread类(不支持多继承)
  • 实现Runnable接口
  • 实现Callable接口
  • 线程池ThreadPoolExecutor

Note:

Callable接口和Runnable接口区别

  • Callable接口的call()方法可以返回值,而Runnable接口的run()方法没有返回值
  • Callable接口的call()方法可以声明抛出异常,而Runnable接口的run()方法不可以声明抛出异常

类ThreadPoolExecutor可以非常方便地创建线程池对象,而不需要程序员设计大量的new实例化Thread相关的代码

 

如何停止一个正在运行的线程?

  • 使用flag,使线程正常退出,也就是当run方法完成后线程终止
package org.fool.java.concurrent.thread;

public class ThreadFlagTest {
    public static void main(String[] args) throws InterruptedException {
        MyThread myThread = new MyThread();

        Thread t1 = new Thread(myThread);
        t1.start();

        Thread.sleep(1000);

        myThread.stop();
    }

    public static class MyThread implements Runnable {
        private volatile boolean flag = true;

        public void stop() {
            flag = false;
        }

        @Override
        public void run() {
            while (flag) {
                System.out.println(Thread.currentThread().getName() + System.currentTimeMillis());
            }
        }
    }
}
  • 使用stop方法强行终止线程(不推荐,deprecated)
  • 使用interrupt方法中断线程(调用interrupt方法仅仅是在当前线程中打了一个停止的flag,并不是真正的停止线程)

Note:

Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated?

 

notify()和notifyAll()有什么区别?

notify是随机唤醒一个等待某个资源的线程,进入就绪队列等待CPU的调度

notifyAll是唤醒所有的,进入就绪队列等待CPU调度 

 

sleep()和 wait()有什么区别?

sleep方法是在指定的时间内让正在执行的线程暂停执行,但不会释放锁。

wait方法是让当前线程等待,直到其他线程调用对象的notify或notifyAll方法。wait方法会释放掉锁,使别的线程有机会占用锁。

 

什么是Daemon线程?它有什么意义?

Java线程类型:

  • 用户线程
  • 守护线程

守护线程是一种特殊的线程,当进程中不存在非守护线程了,则守护线程自动销毁。

Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的引用就是GC。


 

Java如何实现多线程之间的通讯和协作?

同步和互斥,等待/通知机制
可以使用synchronized/wait/notify/notifyAll,Lock/Condition, Semaphore/CountDownLatch/CyclicBarrier/Phaser

 

ThreadLocal作用?

通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题

概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,比如定义一个static变量,同步访问 —— 数据共享,而ThreadLocal采用了“以空间换时间”的方式 —— 数据隔离。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

 

  • 大小: 24.2 KB
分享到:
评论

相关推荐

    java.util.concurrent-多线程框架.docx

    java.util.concurrent 多线程框架 java.util.concurrent 多线程框架是 Java 语言中用于多线程编程的库。该库提供了多种线程池实现、并发集合、同步器、lock 等多种机制,以便开发者更方便地编写高效、可靠的多线程...

    concurrent-1.3.4-sources.jar

    在Java编程领域,"concurrent"一词通常与多线程和并发处理相关,它指的是能够同时执行多个任务的能力。这里提到的`concurrent-1.3.4-sources.jar`是一个特定版本的Java并发库源代码包,它包含了Java并发编程的核心...

    Mihoks#Java-Concurrent-Notes#3-1-案例-售票线程状态1

    title: 3-1-案例-售票&线程状态- Java多线程基础- Java多线程案例categories: Java多线程基础售票案例线程状态售票的动作需要被

    concurrent-all-in-one.pdf

    - 面对多线程环境,提供无锁的原子操作,如`AtomicInteger`、`AtomicReference`等。 - 使用原子类可以减少synchronized的使用,提升性能。 10. **中断机制** - `isInterrupted()`检查线程是否被中断。 - `...

    Mihoks#Java-Concurrent-Notes#2-4-多线程的异常1

    //d2这个线程开启,多了一条执行路径//由主线程执行// * 主线程出异常会导致其所在线程结束但是不会影响其他线程的执行// * Exception in t

    atlassian-util-concurrent-0.0.12.jar.zip

    本文将详细探讨Atlassian发布的`atlassian-util-concurrent-0.0.12.jar`库,这是一个专门针对并发处理的工具集,旨在简化Java开发中的多线程操作。 `atlassian-util-concurrent-0.0.12.jar.zip`是这个库的压缩文件...

    backport-util-concurrent-3.1.jar

    backport-util-concurrent-3.1.jar是一个Java库,它提供了一些并发工具类,用于简化多线程编程。这个库包含了许多实用的工具类,如`FutureTask`、`CountDownLatch`、`Semaphore`等,这些工具类可以帮助开发者更好地...

    backport-util-concurrent-3.1.jar和geronimo-stax-api_1.0_spec-1.0.1.jar

    这些工具可以提高多线程应用程序的性能和可维护性,尤其是在处理大量并发任务时。如果Eclipse Axis2 Codegen插件在旧版本的JDK上运行,可能需要这个库来支持其并发功能。 "geronimo-stax-api_1.0_spec-1.0.1.jar"则...

    backport-util-concurrent(2.2 /3.1)

    总的来说,backport-util-concurrent库是Java并发编程的重要补充,它使得开发者能够利用先进的并发工具,即使在较低版本的Java环境中也能实现高效的多线程应用。无论是ReentrantLock的细粒度控制,还是Phaser的灵活...

    aduna-commons-concurrent-2.6.0.jar.zip

    "aduna-commons-concurrent"项目可能是由Aduna组织开发的一个开源库,专注于并发和多线程编程。 "aduna"通常指的是Aduna开源软件基金会,这是一个荷兰的非营利组织,致力于推动和维护开源软件项目。"commons-...

    aduna-commons-concurrent-2.2.jar.zip

    在Java开发领域,Aduna Commons Concurrent库是一个重要的工具,它为开发者提供了丰富的并发处理工具和类,便于实现高效的多线程应用。这个名为"aduna-commons-concurrent-2.2.jar.zip"的压缩包,包含了Aduna ...

    ant-learn-python-concurrent-main.zip

    4. **GIL(全局解释器锁)**:Python的多线程受到GIL的限制,使得在单个CPU核心上,Python的多线程并不能真正实现并行计算。但GIL对多进程没有影响,因此对于CPU密集型任务,多进程通常比多线程更有效。 5. **并发...

    concurrent-1.3.4.jar

    并发控制:concurrent包提供了一些线程安全的集合类,如ConcurrentHashMap、ConcurrentLinkedQueue等,可以在多线程环境下安全地对集合进行操作,而无需手动添加同步机制。 原子操作:concurrent包提供了一些原子...

    aduna-commons-concurrent-2.5.0.jar.zip

    Aduna Commons Concurrent库为开发者提供了丰富的工具和类,帮助处理多线程环境下的复杂问题。这个名为"aduna-commons-concurrent-2.5.0.jar.zip"的压缩文件,包含了Aduna Commons Concurrent库的2.5.0版本,它是...

    开源项目-streamrail-concurrent-map.zip

    总之,“streamrail-concurrent-map”项目提供了一种在Go语言中实现并发安全映射的方法,它通过有效的并发控制策略解决了原生`map`在多线程环境下的问题,为开发者提供了更可靠的数据结构选项。通过阅读和理解这个...

    实战Concurrent-BlockQueue

    除此之外,`BlockQueue`接口还有许多其他方法,如`offer()`、`put()`、`take()`等,它们在多线程环境中的使用需要结合具体业务场景进行选择。例如,`offer()`方法在队列满时会返回false,而不是阻塞,这在处理突发...

    python教程-05-多线程的使用.ev4.rar

    在Python编程语言中,多线程是一个重要的概念,特别是在处理并发任务和优化程序性能时。本教程“python教程-05-多线程的使用”将深入探讨如何在Python中利用多线程来提高程序效率。 多线程是指在一个程序中同时运行...

    concurrent-1.3.2 connector.

    2. **锁和同步**:为了防止多个线程同时访问共享资源导致的数据不一致,我们需要使用锁和同步机制,如Java的`synchronized`关键字,或者更高级的读写锁、信号量等。 3. **非阻塞I/O**:传统的阻塞I/O会阻塞一个线程...

    swift-Concurrent-函数式并发原语的集合

    "swift-Concurrent-函数式并发原语的集合" 主题着重于如何利用Swift语言的特性来实现高效的并行处理。这里我们将深入探讨Swift中的并发编程概念、函数式并发原语以及如何使用它们来优化代码性能。 首先,Swift 支持...

Global site tag (gtag.js) - Google Analytics