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. iOS 协同开发出fatal error: file ‘XX-Prefix.pch’ has been modified since the precompiled header was built

    在协同开发的时候,刚刚从svn下载到本地的代码,出现“fatal error: file 'XX-Prefix.pch' has been modified since the precompiled ...

  2. memcache 线程深入理解分析 及 源码研究

    http://blog.csdn.net/huithe/article/details/8006186

  3. 2016 ACM/ICPC Asia Regional Shenyang Online 1003/HDU 5894 数学/组合数/逆元

    hannnnah_j’s Biological Test Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K ...

  4. poj 3320 技巧/尺取法 map标记

    Description Jessica's a very lovely girl wooed by lots of boys. Recently she has a problem. The fina ...

  5. POJ 1860 Currency Exchange (最短路)

    Currency Exchange Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 60000/30000K (Java/Other) T ...

  6. POJ 3259 Wormholes (Bellman_ford算法)

    题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

  7. canvas-绘制时钟

    把最近学到的一些canvas技能全部发上来,刚开始写博客,感觉还不太习惯,不过我相信慢慢就会习惯了.不啰嗦了,把代码送上,看不懂的话可以先去学习下基础教程,把基础学好了也就能看懂了. <!DOC ...

  8. ListView滚动到顶部

    videoAdapter.notifyDataSetChanged();videoListView.setSelection(0); 注意顺序先notify后setSelection

  9. URAL 1077 Travelling Tours(统计无向图中环的数目)

    Travelling Tours Time limit: 1.0 secondMemory limit: 64 MB There are N cities numbered from 1 to N ( ...

  10. 利用mybatis_generator自动生成Dao、Model、Mapping相关文件

    技术交流群:233513714 http://blog.csdn.net/wyc_cs/article/details/9023117 http://www.cnblogs.com/smileberr ...