要开启一个多线程有两种方法:
1、继承 Thread 类
通过继承 Thread 类的方式实现多线程有4个步骤:
<1>create 一个类,让它继承 Thread 类
<2>重写 Thread 类里面的 run 方法,把需要执行的代码块放在 run 方法体内
<3>在主线程(主程序)内创建该类的对象
<4>用该对象调用 start 方法
例子:
package multiThread;
public class jichengThread {
public static void main(String[]args){
myThread mt = new myThread();
mt.start();
for(int i=0;i<1000;i++)
System.out.println("主线程程序在执行.......");
}
}
class myThread extends Thread{
public void run(){
for(int i=0;i<1000;i++)
System.out.println("子线程程序在执行.......");
}
}
执行结果:可以看到两个线程在同时执行
但是有时候即使开启了一个多线程(开启多线程就是CPU在执行主程序的时候,同时分配一些空间执行子程序),但是还是看不到两个线程在同时执行,那有可能是主线程的程序执行时间太短,没有看到交替执行的结果,比如在 for 循环里面把循环的次数减小到10,就看不到交替执行的结果,但其实还是多线程
除了创建两个类之外,还可以用匿名内部类的方式继承 Thread 类,重写 Thread 里面的run 方法,调用 start() 方法,实现多线程,如下:
(匿名内部类就是创建一个类的对象,并不给其赋给对应的引用,如下面的 new Thread() 创建了一个 Thread 的对象,米有给其赋给一个引用,而 new Thread 后面跟小括号、大括号,表示该类继承Thread类,并创建了一个Thread类的子类对象,里面的 run 方法表示重写该方法,最终相当于创建了一个 Thread 类的对象,再调用 start 方法执行线程)
package multiThread;
public class nimingneibuleishixian {
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
for(int i=0;i<1000;i++)
System.out.println("子线程在执行....");
}
}.start();
for(int i=0;i<1000;i++){
System.out.println("主线程在执行....");
}
}
}
运行结果:
2、实现 Runable 接口
通过该方法实现多线程的步骤如下:
<1>创建一个类,实现Runnable 接口
<2>重写 run 方法(注意:run 方法是 Runnable 接口里面唯一的方法,Thread 类也是实现了 Runnable 接口)
<3>创建该类的一个对象
<4>调用 Thread 类的有参构造,把上一步创建的对象作为参数传递,创建 Thread 类的一个对象
<5>调用该对象的 start 方法
例子:
package multiThread;
public class shixianRunable {
public static void main(String[] args) {
myRunable mr = new myRunable();
Thread t = new Thread(mr);
t.start();
for(int i=0;i<1000;i++)
System.out.println("主线程程序在执行....");
}
}
class myRunable implements Runnable{
public void run(){
for(int i=0;i<1000;i++)
System.out.println("子线程程序在执行.....");
}
}
同样也可以使用匿名内部类实现 Runnable 接口的方式实现多线程:
package multiThread;
public class nimingneibuleishixian {
public static void main(String[] args) {
//创建一个 Thread 的子类对象
new Thread( //把这里面的东西作为 Thread 的构造参数传入进去
new Runnable(){
@Override
public void run() {
for(int i=0;i<1000;i++)
System.out.println("子线程在执行....");
}
}
).start();
for(int i=0;i<1000;i++){
System.out.println("主线程在执行....");
}
}
}
由于用 new Runnable() 的方式是创建的 Runnable 的子类对象,但是 Runnable 的子类对象里面没有 start 方法,该方法只在 Thread 里面有,所以要把其作为一个参数传递给 Thread 的构造函数,再调用 start 开启线程
**对实现 Runnable 方式创建线程的一点理解:
编译的时候,调用的是 Runnable 接口里面的方法,在实际运行的时候,调用的是 myRunnable 里面的方法
在实际应用中,由于java 不支持多继承,所以当一个类没有继承一个父类的时候,应该优先考虑使用继承 Thread 类的方式,因为这种方式简单,如果继承了其他的父类,就要用实现 Runnable 接口的方式了