一个程序在电脑中开辟一个进程(也可能开两个或多个),但这个进程可以是多线程执行的,譬如迅雷的多线程下载功能,一个进程至少有一个线程。
多线程有两种方法,(1)通过创造新类继承Thread,然后重写run方法。(2)通过自定义类实现Runnable接口,然后重写run方法,再把这个类实例化对象放入new Thread()的括号中。
需要用实例化的对象调用start()才能使用jvm调用run方法,实现多线程,单单的调用run(),不能实现多线程,仅仅会执行run()。
多线程的两种实现方式,其中实现Runnable接口的方法,耦合性较小,建议使用,而继承Thread类的方法,耦合性较大,因为它没有将run方法与Thread类分离开。
可以使用匿名内部类继承Thread或实现Runnable的方式重写Run方法,再调用该线程的方式来创建多线程和启动多线程。
以下是四个小例子,前两个显示了两种创建多线程的方法,后两个显示了两种匿名内部类重写run方法并启动线程的方法。
例1:
public class MyThread extends Thread { public void run() { for(int i=0;i<100;i++){ System.out.println("这是新建的线程"+i); } } }
public class Test { //jvm找OS开了两条路径,对于cpu来说就有了两条路径,这两条路径会被cpu执行,cpu有自己选择的权利,因此会出现随机结果 //你可以理解为两个线程抢夺cpu的资源 public static void main(String[] args) { MyThread my=new MyThread(); my.start(); for(int i=0;i<100;i++){ System.out.println("这是主线程"+i); } } }
例2:
public class RunThread implements Runnable { public void run() { for(int i=0;i<50;i++){ System.out.println("runable"+i); } } }
public class Test4 { public static void main(String[] args) { Thread t=new Thread(new RunThread()); t.start(); for(int i=0;i<60;i++){ System.out.println("main"+i); } } }
例3:
new Thread(){ public void run(){ for(int i=0;i<5;i++){ System.out.println("thread"+i); } } }.start();
例4:
Runnable r=new Runnable(){ public void run(){ for(int i=0;i<5;i++){ System.out.println("Runnable"+i); } } }; Thread t=new Thread(r); t.start();
线程的Sleep(),括号里填写数字,表明该线程休眠多少毫秒
getName(),以String类型返回该线程的名字
Thread.currentThread(),以Thread类型返回当前进程
线程在运行过程中的状态图