`

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-多线程框架

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

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

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

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

    backport-util-concurrent-3.1.jar

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

    concurrent-1.3.4.jar

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

    yibingxiong#java-concurrent-programming-art-mini#03-线程的一些属性1

    非守护线程创建的线程默认为非守护线程,守护则默认为守护线程优先级(priority)优先级高的线程可以得到更多cpu资源, 级别是1-10,默认优先级和创建他的

    concurrent 多线程 教材

    00 IBM developerWorks 中国 : Java 多线程与并发编程专题 02 Java 程序中的多线程 03 编写多线程的 Java 应用程序 04 如果我是国王:关于解决 Java编程语言线程问题的建议 (2) 05 构建Java并发模型框架 (2) 06...

    Concurrent-MultiThread-Async:多线程的使用,concurrent包的使用,并发队列的时候,@ Async方法返回值的异步处理,

    Concurrent-MultiThread-Async:多线程的使用,concurrent包的使用,并发队列的时候,@ Async方法返回值的异步处理,

    Concurrent.Thread.js多线程执行大批量函数

    介绍了一个可以在JavaScript中应用多线程的库:Concurrent.Thread,内有多线程库脚本,以及使用说明和实例,如果查看详情,可以查看我的博客https://blog.csdn.net/hsl_1990_08_15/article/details/84765772

    日本人写的js多线程库Concurrent.Thread-full-20080319.zip

    日本人写的js多线程库Concurrent.Thread-full-20080319.zip 日本人写的js多线程库Concurrent.Thread-full-20080319.zip 日本人写的js多线程库Concurrent.Thread-full-20080319.zip

    Mihoks#Java-Concurrent-Notes#2-2-继承Thread类原理1

    * Thread类中的run方法内部的任务并不是我们所需要的,既然thread类已经定义了线程任务的位置只要重写run方法定义任务的代码即可.* 多线程执行时,

    多线程concurrent的用例

    多线程concurrent的详细使用,为转载,里面是java类,直接拷到Eclipse中就可以运行

    Concurrent.Thread.js javascript多线程

    Concurrent.Thread.js 一个用来让javascript也进行多线程开发的包,感兴趣的快来下吧。

    Concurrent.Thread JS版多线程库

    介绍了一个可以在JavaScript中应用多线程的库:Concurrent.Thread,内有多线程库脚本,以及使用说明和实例

    c# 线程安全队列的用法原理及使用示例

    答:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。 在多线程...

    concurrent-merge-sort

    这种方法需要太多线程,因为Future.get()方法是一个阻塞调用。 对于要在合并排序中排序的每个子列表,我们“可能”需要新线程。 如果线程ppool释放了read,则可以使用它而不是创建新线程。 实际数量无法确定,但...

    java-concurrent-source:Java多并发编程从入门到精通源码-源码通

    并行运算,并发运算1.10 Linux和Windows对于并发采取的不同机制第2章认识Java里面的线程2.1先来看一下线程的简单实现三种方法2.2线程里面的...线程异常的处理第3章线程安全3.1初识Java内存模型与多线程3.2什么是不安全...

    learn-qt-concurrent.zip

    Qt多线程的另外一种方式:Qt_Concurrent .pro QT += concurrent CONFIG += c++11 .h #include #include .cpp qDebug() 主线程" (); QtConcurrent::run([] () { qDebug() 子线程1" (); }); QtConcurrent...

    concurrent-web-server

    使Web服务器成为多线程是您的工作,以便它可以同时处理多个请求。 该项目的目标是: 学习简单的Web服务器的基本架构 了解如何将并发添加到非并发系统 学习如何有效地阅读和修改现有代码库 有用读物包括: HTTP...

Global site tag (gtag.js) - Google Analytics