什么是多线程
Java语言的一大特性就是内置了对多线程的支持,多线程是指同时存在几个执行体,按几条不同的线索共同工作的情况。
多线性(Multithread)是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间相互独立。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的储存空间,而是和所属进程中的其他线程共享一个储存空间,这使得线程间的通信比进程间的通信更为简单。
线程的调度与优先级
Java虚拟机(JVM)中的线程调度器负责管理线程,调度器把线程的优先级分为10个级别。每个Java线程的优先级都在1(Thread.MIN_PRIORITY)和10(Thread.MAX_PRIORITY)之间。如果没有明确地设置线程的优先级别,每个线程的优先级通常为5(Thread.NORM_PRIORITY)。
线程的优先级可以通过setPriority(int grade)方法调整。如果参数不在1~10的范围内,那么setPriority便产生一个IllegalArgumenException异常。需要注意的是有些操作系统只能识别三个级别:1,5,10;
thread.setPriority(10);
创建线程
用Thread子类创建线程
用Thread子类创建两个线程,这两个线程共享一个StringBuffer对象,两个线程在运行期间将修改StringBuffe对象中的字符。
为了使结果尽量不依赖与当前的CPU使用情况,应当让线程主动调用sleep()方法,让出CPU的使用权进入中断状态。
package com.thread;
public class MultiThread_Thread {
public static void main(String[] args) {
StringBuffer str = new StringBuffer();
People p1= new People("张三", str);
People p2= new People("李四", str);
p1.start();
p2.start();
}
}
class People extends Thread {
StringBuffer str;
People(String s, StringBuffer str) {
setName(s);
this.str = str;
}
public void run() {
for (int i = 1; i <= 3; i++) {
str.append(getName() + ",");
System.out.println("wj" + getName() + ",mzs:" + str);
try {
sleep(200);
} catch (InterruptedException e) {
}
}
}
}
用实现Runnable接口方式创建线程
采用Runnable接口方式创建两个线程thread1和thread2,这两个线程使用同一个目标对象,共享目标对象的成员变量number。thread1递增number,thread2递减number,当number小于80时thread1结束run()方法,进入死亡状态;当number小于0时,thread2结束run()方法,进入死亡状态。
package com.thread;
public class MultiThread_Runnable {
public static void main(String[] args) {
Bank bank = new Bank();
bank.setMoney(200);
Thread thread1 = new Thread(bank);
Thread thread2 = new Thread(bank);
thread1.setName("one");
thread2.setName("two");
thread1.start();
thread2.start();
}
}
class Bank implements Runnable{
private int number = 0;
public void setMoney(int m){
number = m;
}
public void run() {
while(true){
String name = Thread.currentThread().getName();
if(name.equals("one")){
if(number<=80){
System.out.println(name+"进入死亡状态");
return;
}
number+=10;
System.out.println("Thread "+name+"当前number"+number);
}
if(name.equals("two")){
if(number<=0){
System.out.println(name+"进入死亡状态");
return;
}
number-=100;
System.out.println("Thread "+name+"当前number"+number);
}
try{
Thread.sleep(800);
}catch(InterruptedException e){}
}
}
}