1线程管理
在这一节中,我们将学习如何创建和运行一个线程。在Java语言中,我们有两种方式创建一个线程:
1. 扩展Thread类,覆盖run()方法
2. 构建一个实现Runnable接口的类,定义自己run()方法,然后,实用则个类的实例对象作为Thread构造方法的参数来创建Thread对象。
创建一个线程对象,它不会创建一个新的执行线程。也就是说,调用一个实现了Runnable接口的类的run()方法,它不会创建一个新的执行线程。仅仅是调用start()方法时,一个新的线程才会被创建。
Thread类保存了一些能够帮助我们标示一个线程的属性信息。
1. ID: 每个线程独一无二的标识符。
2. Name: 存储线程的名称。
3. Priority: 线程对象的优先级属性,其值范围是0到10.除非有特殊要求,一般不推荐修改线程的优先级属性。
4. Status: 这个属性表示线程当前的状态,在Java中,有六种状态:new、runnable
Blocked、time waiting和terminated。
创建一个简单的线程程序。
public class Worker implements Runnable{ private intnumber; /** * Constructor of the class * @param number : The number */ public Worker(intnumber) { this.number=number; } /** * Method that do the calculations */ @Override public voidrun() { for (int i=1; i<=10; i++){ System.out.printf("%s: %d * %d = %d\n",Thread.currentThread().getName(),number,i,i*number); } } /** * @param args */ public staticvoidmain(String[] args) { //create 10 thread, chart one long t1 = System.currentTimeMillis(); for(int i = 0 ; i < 10; i++){ Worker worker = new Worker(i); Thread thread = new Thread(worker); thread.start(); } System.out.println("-----------------------"+(System.currentTimeMillis() - t1)); } }
在看另一个搜索文件的功能,扫描指定文件目录下的文件。完整代码如下:
import java.io.File; import java.util.concurrent.TimeUnit; public class FileSearchRunnable implements Runnable { /** * Initial path for the search */ private StringinitPath; /** * Name of the file we are searching for */ private StringfileName; /** * Constructor of the class * * @param initPath * : Initial path for the search * @param fileName * : Name of the file we are searching for */ public FileSearchRunnable(String initPath, String fileName) { this.initPath = initPath; this.fileName = fileName; } /** * Main method of the class */ @Override public voidrun() { File file = new File(initPath); if (file.isDirectory()) { try { directoryProcess(file); } catch (InterruptedException e) { System.out.printf("%s: The search has been interrupted",Thread.currentThread().getName()); cleanResources(); } } } /** * Method for cleaning the resources. In thiscase, is empty */ private voidcleanResources() { } /** * Method that process a directory * * @param file * : Directory to process * @throws InterruptedException * : If the thread is interrupted */ private voiddirectoryProcess(File file) throws InterruptedException { // Get the content of the directory File list[] = file.listFiles(); if (list !=null) { for (int i = 0; i < list.length; i++) { if (list[i].isDirectory()) { // If is a directory, process it directoryProcess(list[i]); } else { // If is a file, process it fileProcess(list[i]); } } } // Check the interruption if (Thread.interrupted()) { throw new InterruptedException(); } } /** * Method that process a File * * @param file * : File to process * @throws InterruptedException * : If the thread is interrupted */ private voidfileProcess(File file) throws InterruptedException { System.out.println("current file : "+file.getAbsolutePath()); // Check the name if (file.getName().equals(fileName)) { System.out.printf("%s : %s\n",Thread.currentThread().getName(),file.getAbsolutePath()); System.exit(0); } // Check the interruption if (Thread.interrupted()) { throw new InterruptedException(); } } /** * @param args */ public staticvoidmain(String[] args) { FileSearchRunnable searcher=new FileSearchRunnable("C:\\","USERPRIKEY.HS"); Thread thread=new Thread(searcher); // Starts the Thread thread.start(); // Wait for ten seconds try { TimeUnit.SECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } }