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采用了“以空间换时间”的方式 —— 数据隔离。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
j-concurrent 00 IBM developerWorks 中国 : Java 多线程与并发编程专题 02 Java 程序中的多线程 03 编写多线程Java 应用程序 04 如果我是国王:关于解决 Java编程语言线程问题的建议 (2) 05 构建Java并发模型框架 (2) 06 Java 技术: 使您轻松地进行多线程应用程序编程 07 使用JAVA建立稳定的多线程服务器 (3) 08 线程池的介绍及简单实现 09 Java实时多任务调度过程中的安全监控设计 (3) 10 不要重新分配被锁定对象的对象引用 11 以全局的固定顺序获取多个锁来避免死锁 12 Java单例对象同步问题探讨 13 Java 理论与实践: 描绘线程安全性 (2) 14 编写高效的线程安全类 (2) 15 轻松使用线程 同步不是敌人.mht 16 轻松使用线程 减少争用.mht 17 轻松使用线程 不共享有时是最好的.mht 18 适用于 Java 程序员的 CSP,第 1 部分.mht 19 适用于 Java 程序员的 CSP ,第 2 部分.mht 20 适用于 Java 程序员的 CSP ,第 3 部分.mht 21 实现一个不受约束的不变性模型.mht 22 实时 Java,第 3 部分 线程化和同步.mht 23 IBM 的 Java 诊断,第 3 部分 使用面向 Java 的 Lock Analyzer 诊断同步和锁问题.mht 24 实现 Java 多线程并发控制框架.mht 25 多线程、多平台环境中的跟踪.mht 26 使用 ConTest 进行多线程单元测试.mht 27 实现非阻塞套接字的一种简单方法.mht 28 基于事件的NIO多线程服务器.mht 29 驯服 Tiger 并发集合.mht 30 Java5 多线程实践.mht 31 Java 理论与实践 并发集合类.mht 32 Java 理论与实践 构建一个更好的 HashMap.mht 33 Java 理论与实践 JDK 5_0 中更灵活、更具可伸缩性的锁定机制.mht 34 Java 理论与实践 流行的原子.mht 35 Java 理论与实践 非阻塞算法简介.mht 36 Java 理论与实践 处理 InterruptedException.mht 37 Java 理论与实践 正确使用 Volatile 变量.mht 38 使用泛型和并发改善集合.mht

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值