在以往的程序中,多以一个任务完成后才能再进行下一个任务(单线程)
Java提供多线程使程序员可以在程序中执行多个线程,每一个线程完成一个功能,并与其它线程并发执行,这种机制称为多线程。
1.实现线程的两种方式:分别继承java.lang.Thread类和java.lang.Runnable类
①继承Thread类:程序员启动一个新线程需要建立Thread实例
创建一个新的线程:
public class Test extends Thread{
}
完成线程真正功能的代码放在类的run()方法中,当一个类继承Thread类后,就可以在该类中覆盖run()方法,将实现该线程功能的代码写入run()方法中,然后在构造方法中调用start()方法执行线程,也就是调用run()方法
public void run(){
}
public static void main(String[] args){
new Test().start();
}
下面举个例子:
public class Test extends Thread { // 指定类继承Thread类
private int count = 10;
public void run() { // 重写run()方法
while (true) {
System.out.print(count+" "); // 打印count变量
if (--count == 0) { // 使count变量自减,当自减为0时,退出循环
return;
}
}
}
public static void main(String[] args) {
new ThreadTest().start();
}
}
如果没有调用start()方法,线程是不会启动的,虽然实例化了,但没有开启线程
②实现Runnable接口:
比如,当JFrame类不能再继承Thread类(java不支持多继承)这时就需要通过Runnable接口使其具有使用线程的功能
实质上,Thread类实现了Runnable接口,其中的run()方法正是对Runnable接口中的run()方法的具体实现
public class Test extends Object implements Runnable{}
步骤:
(1)建立Runnable对象
(2)使用参数为Runnable对象的构造方法创建Thread实例
(3)调用start()方法启动线程
class A_1{
private int sum;
public void add(int n){
sum+=n;
System.out.println("sum="+sum);
}
}
class Xiancheng implements Runnable{
private A_1 b=new A_1();
public void run(){
for(int x=0;x<3;x++)
{
b.add(100);
}
}
}
public class Testone{
public static void main(String []args){
Xiancheng c=new Xiancheng();//建立Runnable对象
Thread t1=new Thread(c);//使用参数为Runnable对象的构造方法创建Thread实例
Thread t2=new Thread(c);//使用参数为Runnable对象的构造方法创建Thread实例
t1.start();//调用Start()方法启动线程
t2.start();
}
}
2.线程的生命周期
线程具有生命周期,其中分为七个状态:
①出生状态:Thread实例化时
②就绪状态:调用start方法后;当线程得到系统资源后就进入运行状态
③运行状态:当线程进入可运行状态,它就会在就绪与运行状态下转换
④等待状态:调用Thread类中的wait()方法时;用notify()将它唤醒;notifyAll()唤醒所有处于等待状态的线程
⑤休眠状态:调用Thread类中的sleep()方法时,则会进入休眠状态
⑥阻塞状态:线程在运行状态下发出输入/输出请求时,线程将进入阻塞状态
⑦死亡状态:线程的run()方法执行完毕后,线程进入死亡状态
3.线程的操作方法
①线程的休眠:Thread.sleep(2000);睡眠2s
②线程的加入:join(),注意,加入线程B要执行完才执行线程A
③线程的中断:提倡run()方法中使用无线循环,然后用一个boolean值标记控制循环的停止
④线程的礼让:yield();这个语句只是给当前线程一个提醒,说明此资源可以礼让给其它线程,没有保证礼让
4.线程的优先级
setPriorityh("threadName",int 优先级数,threadName);
5.线程的同步
①线程安全:实际开发中,使用多线程程序情况很多,如银行拍好系统、火车售票系统等,这种多线程长城会发生问题(如买票系统)
②线程同步机制:用来解决上述问题,解决资源共享的问题,在给定时间只允许一个线程访问共享资源
(1)同步块:java提供同步机制,使用synchronized关键字
public class ThreadSafeTest implements Runnable {
int num = 10;
public void run() {
while (true) {
synchronized ("") {
if (num > 0) {
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("tickets" + --num);
}
}
}
}
public static void main(String[] args) {
ThreadSafeTest t = new ThreadSafeTest();
Thread tA = new Thread(t);
Thread tB = new Thread(t);
Thread tC = new Thread(t);
Thread tD = new Thread(t);
tA.start();
tB.start();
tC.start();
tD.start();
}
}
将资源放置在同步块中,使用关键字synchronized;语法:synchronized(object){ }
(2)同步方法:就是在前面修饰synchronized关键字的方法
synchronized void a(){}
当某个对象调用了同步方法,该对象上的其它同步方法必须等待该同步方法执行完毕后才能被执行
public synchronized void doit(){
if(num>0){
try{
Thread.sleep(10);
}catch(Exception e){
e.printStackTrace();
}
system.out.println("tickets"+--num);
}
}
public void run(){
while(true){
doit();
}
}