第一章 java多线程技能java
1 线程:进程是操做系统结构的基础,是一次程序的执行,是一个程序及其数据在处理顺序时发生的活动;是程序在一个数据集合上运行的过程,他是系统进行资源分配和调度的一个独立单位。编程
而线程是进程中独立运行的子任务。安全
打印当前线程名:System.out.println(Thread.currentThread().getName());多线程
2 实现多线程编程ide
有两种方式,一是继承Thread,二是实现Runnable,运行起来具备随机性。测试
1.实现接口:this
public class MyRunnable implements Runnable{操作系统
@Override线程
public void run() {对象
// TODO Auto-generated method stub
}
}
实现运行:
Runnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
2.继承Thread:
public class MyThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
}
}
实现运行:
MyThread myThread = new MyThread();
myThread.start();
非线程安全:指多个线程对同一个对象中的同一个实例变量进行操做时会出现值被修改,值不一样步的状况。
3 线程方法集合
1. currentThread()方法返回当前正在执行的线程名称;
System.out.println(Thread.currentThread().getName());
2. isAlive()的功能是判断当前的线程是否还处于存活状态,活动状态,要求线程还在准备运行的状态或者正在执行(已经启动且还没有终止);
3. sleep()方法是指定毫秒数内让当前正在执行的线程休眠;(Thread.sleep())
4. getId()取得线程的惟一标识;返回long
4 中止线程
1. 中止一个线程能够使用Thread.stop()方法,但最好不要使用,由于不安全。
2. 大多数中止一个线程的操做使用Thread.interrupt()方法,但这个方法不会终止一个正在运行
的线程,还须要加入一个判断才能够完成线程的中止,判断线程是否中止:
1.this.interrupted()测试当前线程是否已经中断。
2.this.isInterrupted()测试线程是否已经中断。
关于interrupt()方法,它会将一个标志为设置为true,这个时候用interrupted()会返回true:
Thread.currentThread().interrupt();
if (isInterrupted()) {
break;
//或者throw new InterruptedException();
}
这个通常使用isInterrupted,由于使用interrupted会把标志位修改设反。
在java中有如下三种方法能够终止正在运行的线程:
(1)使用退出标志,使线程正常退出,也就是当run方法完成以后线程退出;
(2)使用stop方法强行退出,可是不推荐使用这个方法,由于stop和suspend及resume
同样,都是过时做废的方法,使用它们可能会产生不可预料的结果;
(3)使用interrupt方法中断线程
5 暂停线程
使用suspend方法暂停线程,使用resume方法恢复线程的执行。
缺点当使用不当,极容易形成公共的同步对象的独占,使得其余的线程没法访问公共对象。
还有也会形成数据不一样步。
注意点
当程序运行到println()内部的时候,同步锁尚未释放。
6 yield方法
放弃当前的cpu资源,将它给其余的任务去占用cpu执行时间,但放弃的时间不肯定,有可能刚刚放弃,立刻又得到了cpu时间片。
7. 线程的优先级
线程能够划分优先级,优先级高的线程获得的cpu资源比较多,是cpu优先执行优先级高的线程
设置优先级使用setPriority(),1-10等级,若是超过这个范围的话会抛出throw new IllegalArgumentException()。
jdk预设的优先级的值
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORTT = 5;
public final static int MAX_PRIORTY = 10;
线程的优先级具备继承性,好比A线程启动B线程,则B线程的优先级与A是同样的。
优先级是设置了,可是不必定最高的就一直在执行,由于它仍是随机的。
8 守护线程
java里有两种线程,一个是用户线程,一个是守护线程。
守护线程是陪伴,但进程中不存在非守护线程的时候才会自动撤销,典型的守护线程时垃圾回收线程。典型的应用是GC(垃圾回收器)。
thead.setDeamon(true);