Java多线程——Thread 和 Runnable



之前介绍了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去判断是否继续执行当前线程。

如何才能写好多线程,是一个长期积累的过程,需要我们在实际业务中去实践、应用;在铁科院的两个项目都很频繁的使用了多线程,所以多线程、安全问题,必须引起重视了。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值