开启多线程的方法

要开启一个多线程有两种方法:

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("子线程程序在执行.......");
	}
}

执行结果:可以看到两个线程在同时执行

开启多线程的方法_第1张图片

但是有时候即使开启了一个多线程(开启多线程就是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张图片

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 接口的方式了

你可能感兴趣的:(多线程)