1. 线程的创建和启动

1.1 继承Thread

  在run方法里,通过this获取当前线程。

  多个线程不能共享实例变量。

1.2 通过实现接口

1.2.1 实现Runable接口

  在run方法里,只能通过Thread.currentThread()获取当前线程。

  多个线程可以共享实例变量。

1.2.2 使用Callable和Future

call()方法比run()方法更强大:

  1. call()方法可以有返回值。

  2. call()方法可以声明抛出异常。

注意:

  1. Callable对象不能直接作为Thread的target
  2. FutureTask类实现了Future接口和Runable接口,可以作为Thread的target

2. 线程的生命周期

  1. new  new一个thread
  2. ready  调用start()
  3. run
  4. blocked
  5. terminated
    1. run()或call()方法正常结束
    2. 线程抛出Exception或Error
    3. 直接调用线程的stop()——容易导致死锁

当主线程结束时,其他线程不会受到影响,并不会随之结束。一旦子线程启动起来后,它就有和主线程相同的地位,它不会受主线程的影响。

3. 线程控制

3.1 join线程

调用者被阻塞,知道被调用线程执行完,调用者才会继续执行。

public class JoinThread extends Thread{

    public JoinThread(String name){
super(name);
} public void run(){
for(int i=0;i<100;i++){
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) throws Exception {
new JoinThread("新线程").start();
for(int i=0;i<100;i++){
if(i == 20){
JoinThread jt = new JoinThread("被join的线程");
jt.start();
//main线程调用了jt线程的join()方法,main线程必须等待
//jt执行结束之后才会向下执行
jt.join();
}
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}

3.2 后台线程

如果所有前台线程死亡,后台线程自动死亡。

前台线程创建的子线程,默认是前台线程。后台线程创建的子线程,默认是后台线程。

 JoinThread jt = new JoinThread("被join的线程");
jt.setDaemon(true);
jt.start();

3.3 线程睡眠

Thread.sleep(3000);

3.4 线程让步

Thread.yield();

3.5 改变线程优先级

Thread.setPriority();

4. 线程同步

4.1 同步块synchronized statements

4.2 同步方法synchronized methods

  单线程:StringBuilder

  多线程:StringBuffer

同步方法,只对同一实例有效果,同一个类的不同实例的同一方法,是没有作用的。

4.3 同步监视器的释放

  1. 释放
    1. 当前线程的同步代码块和同步方法执行结束
    2. 当前线程,遇到了break、return终止了同步代码块和同步方法的执行
    3. 当前线程执行时,遇到了Error或Exception,异常结束时
    4. 当前线程执行同步代码块或同步方法时,程序调用了同步监视器的wait()方法
  2. 不释放
    1. 程序调用Thread.sleep()、Thread.yield()
    2. 其他线程调用当前线程的suspend()方法将当前线程挂起

4.4 同步锁

根接口:Lock、ReadWriteLock

实现类:ReentrantLock、ReentrantReadWriteLock、StampedLock

4.5 死锁

java虚拟机不检测死锁,也没有措施

5. 线程通信

5.1 传统

  1. wait()
  2. notify()
  3. notifyAll()

5.2 Lock and Condition

private final Lock lock = new ReentrantLock();
private final Condition cond = lock.newCondition();
...
cond.await();
cond.signal();
cond.signalAll();

5.3 BlockingQueue

6. 线程组

ThreadGroup

7. 线程池

  1. Executors
  2. ForkJoinPool

8. 线程相关类

8.1 ThreadLocal类

复制资源,不同的线程拥有不同的副本。

8.2 包装线程不安全的集合

HashMap m = Collections.synchronizedMap(new HashMap());

8.3 线程安全的集合

在java.util.concurrent包下

  1. Concurrent开头
    1. ConcurrentHashMap
    2. ConcurrentSkipListMap
    3. ConcurrentSkipListSet
    4. ConcurrentLinkedQueue
    5. ConcurrentLinkedDeque
  2. CopyOnWtrite开头
    1. CopyOnWriteArrayList
    2. CopyOnWriteArrayset

Java-Thread的更多相关文章

  1. Java Thread 的 sleep() 和 wait() 的区别

    Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别       1. sleep ...

  2. Java Thread 的 run() 与 start() 的区别

    Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别             1. ...

  3. Java Thread wait, notify and notifyAll Example

    Java Thread wait, notify and notifyAll Example Java线程中的使用的wait,notify和nitifyAll方法示例. The Object clas ...

  4. java: Thread 和 runnable线程类

    java: Thread 和 runnable线程类 Java有2种实现线程的方法:Thread类,Runnable接口.(其实Thread本身就是Runnable的子类) Thread类,默认有ru ...

  5. Java Thread join() 的用法

    Java Thread中, join() 方法主要是让调用改方法的thread完成run方法里面的东西后, 在执行join()方法后面的代码.示例: class ThreadTesterA imple ...

  6. Java thread jargon

    In Java thread topic, the task to be executed and the thread to drive the task are two concepts shou ...

  7. 性能分析之-- JAVA Thread Dump 分析综述

    性能分析之-- JAVA Thread Dump 分析综述       一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...

  8. Java Thread线程控制

    一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...

  9. [译]Java Thread wait, notify和notifyAll示例

    Java Thread wait, notify和notifyAll示例 Java上的Object类定义了三个final方法用于不同线程间关于某资源上的锁状态交互,这三个方法是:wait(), not ...

  10. [译]Java Thread Sleep示例

    Java Thread Sleep示例 java.lang.Thread sleep(long millis)方法被用来暂停当前线程的执行,暂停时间由方法参数指定,单位为毫秒.注意参数不能为负数,否则 ...

随机推荐

  1. python numpy 模块简单介绍

    用python自带的list去处理数组效率很低, numpy就诞生了, 它提供了ndarry对象,N-dimensional object, 是存储单一数据类型的多维数组,即所有的元素都是同一种类型. ...

  2. Mvc3.0_笔记

    1.保留文本框中的值:<p>Find @Html.TextBox("searchKey", ViewBag.Filter as string)</p>  这 ...

  3. 铺地毯 2011年NOIP全国联赛提高组

    题目描述 Description 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有n 张地毯,编号从1 到n.现在将这些地毯按照编号从 ...

  4. 1-1 Windows应用程序的特点

    主要内容:介绍Windows应用程序的特点,并附加了消息和事件的一些区别 //以后该分类中字体均采用 隶书 4(14pt) 1. 面向对象 <1>针对Windows应用本身,如记事本界面, ...

  5. 关于kafka连接不上别的机器问题Connection refused

    1.确认config里面的server.properties 正确(包括IP+端口2181记得看清,用hostname的话记得etc/hostnames下面查看全部配置上没,建议用hostname方便 ...

  6. 用Spring的mappingDirectoryLocations来配置Hibernate映射文件

    在Spring的applicationContext.xml中配置映射文件的方法: <property name="mappingResources">     < ...

  7. 文件的搜寻【转vbird】

    which (寻找『运行档』) [root@www ~]# which [-a] command 选项或参数: -a :将所有由 PATH 目录中可以找到的命令均列出,而不止第一个被找到的命令名称 分 ...

  8. dll--二进制层面的复用

    积木式思想其实是很自然的一个过程,从c的库函数到C++的标准库,再到dll.com.com+都是这种思想推动下的结果,和现实生活中的人们的思维方式并无二致,只不过软件是在一个虚拟的世界中,并分化出许多 ...

  9. Processor Speculative & pipeline

    https://en.wikipedia.org/wiki/Instruction-level_parallelism https://en.wikipedia.org/wiki/Instructio ...

  10. Oracle升级前备份和失败回退

    一.升级前备份 1.软件备份[root@localhost backup]# su - oracle [oracle@localhost ~]$ cd $ORACLE_HOME[oracle@loca ...