Java多线程

首先来理解一下什么线程,什么是进程。

 个人认为,进程线程应用程序的父子关系是这样的:

java 多线程 封装 java多线程程序_java


一个应用程序至少有一个进程。一个进程至少有一个线程。

 在任务管理器也可以看得到如何。我启动了一个UC浏览器:

java 多线程 封装 java多线程程序_多线程_02

如何在JAVA中实现多线程

方法有两个:

1.     继承Thread类

2.     实现Runnable接口。

 

首先演示一下继承Thread类的办法:

class A extends Thread{
	public void run(){			//覆盖Thread类中的run方法。里面要写的是该线程的执行任务。
		for(int i = 0; i <20; i++){
			System.out.println("线程"+Thread.currentThread().getName()+"正在运行");
		}
	}
}
class ThreadDemo{
	public static void main(String args[]){
		A a = new A()	;
		a.start();
		for(int i = 0; i<20; i++){
			System.out.println("线程"+Thread.currentThread().getName()+"正在运行");
		}
	}



运行结果:


java 多线程 封装 java多线程程序_多线程_03

 

通过继承Thread来实现多线程:覆盖run方法。用start()方法创建线程并执行run方法。

我们知道,java中是单继承的,那么这么好的一个继承机会就给了它,是一个缺陷,java官方后来给出了一种实现接口的方法来实现多线程。

 

那么,实现Runnable接口的方法:


class A implements Runnable{
	public void run(){			//覆盖Thread类中的run方法。里面要写的是该线程的执行任务。
		for(int i = 0; i <20; i++){
			System.out.println("线程"+Thread.currentThread().getName()+"正在运行");
		}
	}
}
class ThreadDemo{
	public static void main(String args[]){
		A a = new A()	;
		new Thread(a).start();
		for(int i = 0; i<20; i++){
			System.out.println("线程"+Thread.currentThread().getName()+"正在运行");
		}
	}
}




可以看出在创建线程类时实现Runnable接口和继承Thread类里面的代码是一样的,执行的任务都是放在run方法里。

而在线程的启动方面,是有所不同的。如果直接调用run方法,是没有启动创建新的线程的。线程的创建都是要通过Thread类的start()方法创建线程并执行run代码的,那么我们要创建一Thread类的实例,Thread类中有一个构造方法是传入Runnable实例来进行Thread类实实例化的。

java 多线程 封装 java多线程程序_java_04

那么我们就可以利用这个方法构建一个Thread实例,趁机调用start()方法创建线程并执行run();(其实创建Thread实例只是一个踏板而已,目的是调用start()方法)

 

既然是不同的的方法,自然各自有各自的优点:

继承Thread类的优点:

1.     没想到。

实现Runnable接口的优点:

1.     可以继承别的类。省下一个继承的机会。

2.     可以实现资源共享。

 

下面讲讲为什么实现Runnable接口来启动线程能实现资源共享。(当初我想了好久一会。。。而且在网上搜索还没找到有关于这个的。。我决定把它独立放出来!让有需要的人能找到的到!)