每一个java程序中至少都有一个线程——主线程。当java程序运行时JVM会创建一个主线程,并在这个线程中调用主函数中的方法
线程分为单线程和多线程
单线程:顺序调用
例: ma(){
mb();
mc();
print(a);
}
mb(){
md();
print(b);
}
mc(){
print(c);
}
最后输出结果会按顺序输出
多线程:
同时执行多个方法
例 ma(){
Thread.start();mb();
Thread.start();mc();
Thread.start();md();
print(a);
}
mb(){
print(b);
}
mc(){
print(c);
}
md(){
print(d);
}
哪个方法先执行完是不一定的要看方法内容
2.线程与进程之间的区别
1.一个应用程序就是一个进程(进行中的应用程序),而线程是一个程序程序内部的多个运行单位。
2.多个进程内部的数据时独立的,进程中通信大多数是必须通过网络实现的。而线程中是共享的(同一进程中)。
3.线程本身的数据通常只有寄存器数据以及一个程序运行时使用的堆栈,所以线程切换的负担比进程切换的负担要小。
3.线程实现的方法
1.继承Thread类
2.实现Runnable接口
3.匿名内部类
/** * 统计米一个磁盘文件数量的线程类 * @author Administrator * */ public class CountFileThread extends Thread{ private String rootDirName; /** * 构造器传入一个根目录名 * @param root */ public CountFileThread(String root){ this.rootDirName = root; } //线程执行入口:调用线程对象的start方法后线程就从它的run方法开始独立执行 public void run(){ long start =System.currentTimeMillis(); int fileCount = countDir(this.rootDirName); long timeCost=System.currentTimeMillis(); System.out.println("-------驱动器:"+fileCount+"用时(单位:秒)"+timeCost/1000); } private int countDir(String dir){ int count=0;//文件长度的变量 File dirFile = new File(dir); if(!dirFile.exists()){//如果用户输入的目录不存在 return count; } File[] subfile = dirFile.listFiles(); if(subfile==null){//如果列表子文件不存在 return count; } for(int i=0;i<subfile.length;i++){ if(subfile[i].isDirectory()){ count+=countDir(subfile[i].getAbsolutePath()); } if(subfile[i].isFile()){ count++; } } return count ; } }
主函数中调用
public class MainCount { public static void main(String [] args){ //取得系统的根目录个数 File[] file =File.listRoots(); for(int i=0;i<file.length;i++){ //创建线程对象 CountFileThread cf = new CountFileThread(file[i].getAbsolutePath()); cf.start(); } System.out.println(file.length+"个系统线程对象"); } }
继承接口:
public class RunnableTest implements Runnable{ //程序启动类 public static void main(String [] args){ for(int t=100;t<1010;t++){ RunnableTest rt = new RunnableTest(t); Thread thread = new Thread(rt); thread.start(); } } /** * 构造方法 */ public RunnableTest(int id){ this.id = id; } @Override public void run() { // 循环当前时间点 while(true){ long currentTime = System.currentTimeMillis(); System.out.println(id+"号线程"+currentTime); } } private int id; }
匿名内部类
/** * 匿名内部类 */ ActionListener al = new ActionListener(){ public void actionPerformed(ActionEvent e) { //得到动作命令值 final String command =e.getActionCommand(); /** * 匿名内部线程 */ Thread t= new Thread(){ public void run(){ //得到刚开始时的时间 long start=System.currentTimeMillis(); //如果动作命令值是统计时 if(command.equals("统计")){ jt.setText(""); File fi =(File)jb.getSelectedItem(); int count =Count(fi); System.out.println(fi.getName()+"文件个数"+count); jt.append("\n"+count); } //如果动作命令值是全盘统计 if(command.equals("全盘统计")){ jt.setText(""); int count =0; for(int i=0;i<file.length;i++){ count+= Count(file[i]); System.out.println(file[i].getName()+"文件个数"+count); } jt.append("\n"+count); } } }; t.start(); } };