1.多线程
多线程程序是指一个程序中包含多个执行流,它是实现并发机制的有效手段。从逻辑的观点看,多线程意味着一个程序的多个语句块同时执行,但不等于多次启动一个程序。
引入多线程程序设计的原因:
①某些应用具有内在的多控制流结构,这些控制流具有合作性质,需要共享内存。采用多线程易于对问题建模。
②在需要多控制流的应用中,多线程比多进程在速度上具有绝对优势。统计表明,线程的建立速度约比进程的建立速度快100倍。
③采用多线程可提高处理机与设备之间的并行性。
④在多处理机的硬件环境中,多线程可并行执行,从而可提高资源利用率和进程推进速度。
多线程机制是Java语言的重要特征之一,Java是基于操作系统级的多线程环境设计的,JVM依靠多线程来执行多任务,并且所有类库在设计时多考虑到多线程机制。
Java的多线程是一个类,这个类可以对它的线程进行控制,可以确定哪个线程的优先提高,哪个线程应该执行等等。线程的执行由拥有这个线程的一个或多个类来控制。
Java中实现线程的方法有两种,第一种是生成Thread类的子类,并定义该子类自己的run()方法,县城要完成的任务在run()方法中实现。这种方法比较简单,但是如果定义的类已经是其他类的子类,而Java不允许多重继承,我们可以采取第二种方法实现Runnable接口,通过实现Runnable接口中的Run()方法来完成线程的任务。
2.构建Thread子类对象
Java直接定义了一个从根类object中派生的Thread类。所以从java.lang.Thread类派生的直接子类或间接子类均为线程。构建Thread子类对象的步骤如下:
①构建的Thread子类,重写其中run ()方法。
②创建线程对象。
③线程对象调用start()方法启动该线程。
实例:
public class Main {
public static void main(String[] args) {
System.out.println("Starting Main");
A t1=new A("thread1");
t1.start();
A t2=new A("thread2");
t2.start();
A t3=new A("thread3");
t3.start();
}
}
public class A extends Thread{
String threadId;
public A(String threadId){
this.threadId=threadId;
}
public void run(){
System.out.println("Thread start:"+this.threadId);
for(int i=0;i<6;i++){
System.out.println("i="+(i+1)+"\t");
System.out.println("Thread stopped:"+this.threadId);
}
}
}
以下是运行结果:
Starting Main
Thread start:thread1
Thread start:thread3 i=1
Thread start:thread2
Thread stopped:thread3 i=1 i=2
Thread stopped:thread3 i=1
Thread stopped:thread2 i=2 i=3
Thread stopped:thread1
Thread stopped:thread3
Thread stopped:thread2 i=3
Thread stopped:thread2 i=4
Thread stopped:thread2 i=5
Thread stopped:thread2 i=6
Thread stopped:thread2 i=4
Thread stopped:thread3 i=2
Thread stopped:thread1 i=3
Thread stopped:thread1 i=4
Thread stopped:thread1 i=5
Thread stopped:thread1 i=6
Thread stopped:thread1 i=5
Thread stopped:thread3 i=6
Thread stopped:thread3
每次运行会产生不同的结果,因为它没有确定什么时候执行哪个线程。同时运行的不止3个线程,至少需要4个线程,其中3个线程在main()方法中创建,并相互独立地运行,还有一个线程执行main()方法。
下面是利用Thread来买车票的简单代码:
public class Main {
public static void main(String[] args) {
Ticket t=new Ticket();
t.start();
Ticket t1=new Ticket();
t1.start();
}
}
public class Ticket extends Thread{
private static int ticket=10;
public Ticket(){}
public void run(){
while (ticket!=0) {
ticket--;
System.out.println(getName()+" "+"剩余车票:"+ticket);
}
}
}