之前介绍了java多线程的创建和同步原理,本文将进一步对比进程和线程的联系以及两种创建多线程的方式对比。
一、进程和线程
进程:举个简单的例子,平时电脑运行qq.exe、eclipse的应用程序,当程序一运行,便开始占用系统资源;一个正在运行的程序,就是一个进程。进程是动态的,占用资源(内存),同时也是线程的载体。
线程:一个运行中的eclipse,我们可以用它来进行代码编写、文本创建、编辑;这就是一个进程中所开启的多个线程。
进程是线程的载体,一个进程开启后,可进行多线程运行。就好比一个班集体工作,这是一个进程;而班级中每个学生各自完成自己的任务,这就是线程。
二、 Thread 和 Runnable 创建多线程
在【java多线程——线程的创建和启用】中已经介绍了两种创建进程的方式,一是继承Thread 基类,一是实现Runnable 接口;那么两种创建线程的有何不同?请看下面例子:
public class Actor extends Thread { //java 文件中可有多个类,but 只有一个public 继承Thread基类
public void run()
{
System.out.println(getName()+"是一个演员!");
int count=0;
boolean keepRunning=true;
while(keepRunning)
{//Thread类可直接getName方法,但是实现接口,就要调用thread.currentThread.getName()
System.out.println(getName()+"开始演出:"+(++count));
if(count==100)
{
keepRunning=false;
System.out.println(getName()+"演出结束");
}
if(count%10==0)
{
try {
Thread.sleep(1000);//休眠1s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args)
{
Thread actor=new Actor();
actor.setName("钟艾伶");
actor.start();
//Thread actress=new Actress(); 不能new
//Thread 构造函数,Runnable target,String name
Thread actress =new Thread(new Actress(),"王大宝");
actress.start();
}
}
class Actress implements Runnable //实现Runnable接口
{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"是一个演员!");
int count=0;
boolean keepRunning=true;
while(keepRunning)
{
System.out.println(Thread.currentThread().getName()+"开始演出:"+(++count));
if(count==100)
{
keepRunning=false;
System.out.println(Thread.currentThread().getName()+"演出结束");
}
if(count%10==0)
{
try {
Thread.sleep(1000);//休眠1s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//两个线程,cpu在同一时间只处理一个线程,当一条线程休眠之后,另一条线程才开始被处理。
}
通过上面两个类分别继承Thread 和实现Runnable接口,从main方法中进行实例化和方法调用可以看出:
1、继承Thread类的线程对象可直接使用getName方法获取当前线程名,但实现接口的对象,就要调用thread.currentThread.getName()来获取;
2、继承Thread类的线程类在实例化时,可直接new className()创建实例,而实现接口的类则需要通过new Thread()构造方法,闯入Runnable target,String name两个参数进行实例化;
三、 线程常用方法:
除了start启动线程,sleep(1000) 使调用发方法的线程休眠1s之外,线程应用中还常使用哪些方法?
注意此处并未列出线程的stop方法,因为考虑到线程安全问题,stop方法一旦调用,当前执行线程中所有信息都被情况,线程停止执行。例如当前线程正执行一个事务操作,调用stop方法停止线程是不安全的,所以针对线程关闭,还是比较建议上面代码里,加一个标志符,keepRunning,通过keepRunning去判断是否继续执行当前线程。
如何才能写好多线程,是一个长期积累的过程,需要我们在实际业务中去实践、应用;在铁科院的两个项目都很频繁的使用了多线程,所以多线程、安全问题,必须引起重视了。