前言
多线程的应用使程序拥有并发运行的能力,进而实现程序的多任务作业。在java中主要提供两种方式现实多线程,它们需要继承java.lang.Thread类或实现java.lang.Runnable接口。
继承Thread类
程序员启动一个新线程需要建立Thread实例,Thread类中常用的两个构造方法如下:
Public Thread(): 创建一个新的线程对象
Public Thread(String threadName): 创建一个名称为threadName的线程对象。
语法如下:
Public class ThreadTest extends Thread{
}
完成线程对象创建后,需要重写run()方法,当一个类继承Thread类后,将实现该线程功能的代码写入run()方法中,然后同时调用Thread类中的start()方法执行线程,即调用run()方法。需要注意的是start()方法调用一个已经启动的线程,系统将抛出IllegalThreadStateException异常。
Thread实例
public class ThreadTest extends Thread{
private int count = 10;
public void run(){
while(true){
if(count == 0){
return;
}
try{
Thread.sleep(10);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.print(count+" ");
count--;
}
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
ThreadTest mytest1 = new ThreadTest();
ThreadTest mytest2 = new ThreadTest();
mytest1.start();
try{
//mytest1.join();//等待线程 mytest1先完成再继续执行mytest2线程
}catch(Exception e){
e.printStackTrace();
}
mytest2.start();
}
}
多线程运行效果:
Thread.join()方法可以使一个线程等待另一个线程完成后再继续执行,在实际应用中,通常用来实现两件互斥的事务处理。加入Thread.join()线程方法控制的多线程运行效果:
线程同步机制
如何解决资源共享的问题呢,可以使用线程锁来实现共享资源的互斥访问。在java中提供了同步机制,可以有效防止资源冲突。
1.使用同步块
同步机制使用synchronized关键字
public class ThreadTest extends Thread{
private int count = 10;
public void run(){
while(true){
//使用同步块
synchronized ("") {
if(count > 0){
try{
Thread.sleep(10);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.print(count+" ");
count--;
}
}
}
}
}
public class Main {
public static void main(String[] args) {
ThreadTest mytest1 = new ThreadTest();
Thread tA = new Thread(mytest1);
Thread tB = new Thread(mytest1);
Thread tC = new Thread(mytest1);
Thread tD = new Thread(mytest1);
tA.start();
tB.start();
tC.start();
tD.start();
}
}
2.使用同步方法
同步方法就是在方法面前修饰synchronized关键字的方法,其语法如下:
Synchronized void f(){
}
当某个对象调用了同步方法时,该对象上的其他同步方法必须等待该同步方法执行完毕后才能被执行。必须将每个访问共享资源的方法修饰为synchronized,否则就会出错。
public class ThreadTest extends Thread{
private int count = 10;
public synchronized void mysyn(){
if(count > 0){
try{
Thread.sleep(10);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.print(count+" ");
count--;
}
}
public void run(){
while(true){
mysyn();
}
}
}
public class Main {
public static void main(String[] args) {
ThreadTest mytest1 = new ThreadTest();
Thread tA = new Thread(mytest1);
Thread tB = new Thread(mytest1);
Thread tC = new Thread(mytest1);
Thread tD = new Thread(mytest1);
tA.start();
tB.start();
tC.start();
tD.start();
}
}
多线程未加同步控制时的运行效果,可见其资源访问存在竞争(答应输出到了负数,显然不符合程序设计需求):
多线程加同步控制运行效果:
总结
多线程是轻量级的多进程实现,在节省系统资源开支的同时,实现了程序的并发运行,使得软件能够多任务执行。但是在多线程应用中,需要考虑到线程的同步,共享资源竞争等问题,线程锁可以实现线程的同步互斥,但使用不当可能引起死锁现象,故应当合理正确使用线程锁。