Java线程速览

Java线程速览
一:什么是线程?
线程其实就是程序执行的最小的一个单元。程序的执行过程本质上就是线程的启动和运行的过程。每一个程序都至少含有一个线程,如果程序只含有一个线程,那个这个线程就是程序本身,称为“主线程”。
二:多线程有什么用?
线程是一个相对独立,可调度的执行单元,是系统独立调度和分派CPU的基本单元。因而,利用线程相对独立的特性,可实现程序不同部分的同时独立运行。通过多线程机制,可以让程序的不同部分同时完成不同的工作,使得程序更加灵活,更为高效。
Windows系统可以同时运行不同的程序,网站可以同时服务不同的客户…这些都是通过多线程机制实现。可见,多线程机制在编程中起着至关重要的作用,是程序实现复杂功能的
前提条件
三:java中怎么实现多线程
在java编程中其实无时无刻不在使用这多线程机制。在java最基础的swing界面中,便大量使用了多线程。其实每一个swing组件都是一个线程,在组件被创建时,便开启了一个线程。当swing被展示是,主函数所在的线程,主线程其实已经结束,活跃的便是组件所开启的线程。
Swing组件所开启的线程都是java中已经存在的线程,灵活性较小,无法满足全部的变成需求。比如现在要编写一个买票的系统,单纯使用swing组件线程便无法完成。所以要想真正实现程序的多线程,便必须掌握自定义线程的实现方法。
在java中线程的实现方法共有三种,分别是继承Thread类、实现Runnable接口、继承TimerTask 。
(1) 继承Thread类
这种方法的实现步骤分为两步
首先需要构造一个继承了Thread类的类,并复写其中的run()方法。
其次需要在主函数中新建一个子类对象,并调用run()方法,这样就可以开启一个新的线程并执行run()方法中的代码
(2) 实现Runnable接口
这种方法的实现方式与第一种基本相同,唯一不同的是,在构造好类并创建对象后需要将该对象传入一个Threa对象,然后在调用Thread对象的run()方法来开启线程
(3) 继承Timertask类
这种方法与第一种也基本一致,不同的是这个对象在开启线程是需要借组Timer类。而且和上面两种不同的是,这个方法在开启线程后会不断执行重复执行run()方法中的代码,而前两中方法只会执行一次。

四:多线程实现的Java代码举例
方法一:
public class CountFileThread extends Thread{
private String rootFileName;
/**
* 构造方法
* @param root 需要进行统计的根目录
*/
public CountFileThread(String root){
this.rootFileName = root;
}


public int countDir(String dir){
int count = 0;//用于记录文件总数
File file = new File(dir);
if (!file.exists()){
return count;
}
File[] files = file.listFiles();
if (files == null){
return count;
}
for (int i=0;i<files.length;i++){
if (files[i].isDirectory()){
count+=countDir(files[i].getAbsolutePath());
}
if (files[i].isFile()){
count++;
}
}
return count;
}

public void run(){
long start = System.currentTimeMillis();
int fileCount = countDir(this.rootFileName);
long time = System.currentTimeMillis()-start;
System.out.println("----驱动器:"+this.rootFileName+"统计完毕"+",共有文件数量:"+fileCount+",用时:"+time/1000);
}


}

public class MainCount {

public static void main(String[] args) {
// TODO Auto-generated method stub
File[] files = File.listRoots();
for (int i=0;i<files.length;i++){
CountFileThread cf = new CountFileThread(files[i].getAbsolutePath());
cf.start();
}
System.out.println(files.length+"个统计线程已经启动....");
}

}


方法二:
public class RunnableTest implements Runnable{
private int id;
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i=1;i<5;i++){
RunnableTest rt = new RunnableTest(i);
Thread t = new Thread(rt);
t.start();
}
}

RunnableTest(int id){
this.id = id;
}

@Override
public void run() {
// TODO Auto-generated method stub
while (true){
long currentTime = System.currentTimeMillis();
System.out.println("线程:"+id+"显示时间:"+currentTime);
try {
Thread.sleep(id*500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("线程出现错误");
}
}
}

}


方法三:
package 线程创建.第三种;

import java.util.Timer;
import java.util.TimerTask;


public class TimerTaskDemo extends TimerTask{
private int runCount = 0;
@Override
public void run() {
// TODO Auto-generated method stub
runCount ++;
System.out.println(runCount+"次定时运行:"+System.currentTimeMillis());
}

public static void main(String[] args){
Timer t = new Timer();
TimerTaskDemo ttd = new TimerTaskDemo();
t.schedule(ttd, 5000, 1000);
}

}


猜你喜欢

转载自729660130.iteye.com/blog/2214614