多线程
简要介绍java中多线程相关知识
(一)多线程介绍:
随着CPU进入双核、多核时代,多线程的优势越来越明显。多线程是Java中的并发机制,表示能够在同一时间内同时执行多个操作。
这里举个多线程的例子,多线程实际开发例子:在很多网站中,当用户注册后,系统一方面会通知用户已经注册成功,一方面向用户在注册时填写的Email中发送邮件。(二)如何定义线程:
定义线程有两种方法,一种是继承Thread类,一种是实现Runnable接口。
A、继承Thread类:定义一个线程可以通过继承Thread类来实现,这是一种相对简单的定义线程的方法。在Thread类中具有一个run方法,在定义的线程中需要重写这个方法。
B、实现Runnable接口:通过实现Runnable接口来实现。 在Runnable接口中具有一个抽象的run方法, 在实现Runnable接口时, 需要实现该run方法。
这两种方法中都需要定义一个run方法,不管该方法是通过重写父类方法,还是实现接口方法。 run方法是一个线程的入口,是线程必须具有的。使用通过实现Runnable接口定义的线程中,要想创建线程对象就不是很容易做到的。因为直接创建类对象,创建的并不是一个线程对象。要想创建线程对象,必须要借助Thread类:
XianCheng x = new XianCheng(); Thread t = new Thread(x);(三)线程是存在生命周期的:
线程的生命周期分为五种不同的状态:分别是新建状态、准备状态、运行状态、等待/阻塞状态和死亡状态。
1、新建:当一个线程对象被创建后;
2、准备:处于新建状态中的线程被调用start方法后;
3、运行:处于准备状态中的线程一旦被系统选中,使线程获取了CPU时间,就会进入运行状态;
4、等待/阻塞:许多线程调度的方法,包括睡眠、阻塞、挂起和等待,这些方法将在后面的调度章节中讲解。使用这些方法都会将处于运行状态的线程调度到等待/阻塞状态;
5、死亡:当线程中的run方法执行结束后,或者程序发生异常终止运行后,线程会进入死亡状态。(五)常用函数:
1、sleep(long millis): 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
2、join():指等待t线程终止。使用方式。join是Thread类的一个方法,启动线程后直接调用,即join()的作用是:“等待该线程终止”,这里需要理解的就是该线程是指的主线程等待子线程的终止。也就是在子线程调用了join()方法后面的代码,只有等到子线程结束了才能执行。
3、yield():暂停当前正在执行的线程对象,并执行其他线程。
代码1:继承Thread方法,使用了sleep函数:
package TestDuoxiancheng;
//使用sleep(long millis): 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
public class TestThread1 extends Thread{
private String name;
private int count = 5;
public TestThread1(String name){
this.name = name;
}
public void run() {
for(int i=0;i<5;i++){
System.out.println(name + "线程在运行,此时的 count= " + count--);
try {
sleep((int) Math.random() * 5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestThread1 T1 = new TestThread1("A");
TestThread1 T2 = new TestThread1("B");
System.out.println("实现Thread类的方法:");
T1.start();
T2.start();
}
}
代码2:实现Runnable接口:
package TestDuoxiancheng;
//使用sleep(long millis): 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
public class TestRunnable1 implements Runnable{
private int count=4;
public void run(){
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName() + "线程在运行 count= " + count--);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestRunnable1 TR1 = new TestRunnable1();
Thread T1 = new Thread(TR1,"C");
Thread T2 = new Thread(TR1,"D");
System.out.println("继承Runnable的方法:");
T1.start();
T2.start();
}
}