第一章 java多线程技能
1 线程:进程是操作系统结构的基础,是一次程序的执行,是一个程序及其数据在处理顺序时发生的活动;是程序在一个数据集合上运行的过程,他是系统进行资源分配和调度的一个独立单位。
而线程是进程中独立运行的子任务。
打印当前线程名:System.out.println(Thread.currentThread().getName());
2 实现多线程编程
有两种方式,一是继承Thread,二是实现Runnable,运行起来具有随机性。
1.实现接口:
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);