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. Install Fastx (zz)

    Fastx-toolkit installation on CentOS ===================================== Tested on CentOS release ...

  2. 阿里云Centos中二级域名绑定二级目录的方法

    对于一些目录,我们往往需要对其指定二级域名,那么具体如何操作呢?下面,我将用亲身实践来说明一下. 由于第一次接触centos,我不得不借助于网络资源.然后得知要开启mod_rewrite这个模块,具体 ...

  3. eclipse项目导入到android studio

    只需要添加gradle文件,在里面添加如下代码片段------------------------------------------- main { manifest.srcFile 'Androi ...

  4. activiti 任务节点 处理人设置【转】

    转自http://blog.csdn.net/qq_30739519/article/details/51225067 1.1.1. 前言 分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自 ...

  5. Hibernate设置派生属性(formula)

    一.Customer中包含的字段: private static final long serialVersionUID = 1L;    private Integer id;    private ...

  6. Ansible安装配置及使用

    一.Ansible特点 1.不需要安装客户端,通过sshd通信 2.基于模块工作,模块可以由任何序言开发 3.不仅支持命令行使用模块,也支持编写yaml格式的playbook 4.支持sudo 5.有 ...

  7. Codeforces Round #125 (Div. 2)

    A. Hexadecimal's theorem 三个数没有限制,直接输出\(0\ 0\ n\). B. Special Olympics 分包含和外离情况,包含分2种情况. C. About Bac ...

  8. P235 实战练习(集合类2)、摇奖程序和验证码(修改版)

    1.分别向Set集合以及List集合中添加“A”.“a”.“c”.“C”.“a”5个元素,观察重复值“a”能否在List集合以及Set集合中成功添加. package org.hanqi.practi ...

  9. lightoj1074 最短路

    题意:有n个城市,每个城市有拥挤值,有一些单向道路,从某个城市到另一个城市的花费是拥挤值差的三次方,当然可能是负的值.问从1点到某点最少的花费,若小于3或不能到达输出“?” 建图的边权是拥挤值差的三次 ...

  10. 磁盘分区、格式化、挂载[转自vbird]

    磁盘分区.格式化.挂载磁盘分区    新增分区    查询分区    删除分区磁盘格式化    mkfs    mke2fs磁盘挂载与卸载    mount    umount 磁盘的分区.格式化.挂 ...