java线程(一)

简单说一下 程序、进程、线程

       进程:当一个程序“跑” 起来的时候就是一个进程,即一个正在执行的程序,可以理解为:进程是一个”活“的程序。

       线程:在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。

       多线程:在一个程序中,可以同时运行多个执行单位(程序块)。 多线程可以让不同的程序块一起运行,可以让程序运行更流畅,达到多任务处理的目的。


如何创建线程呢?

多线程的创建方式:

方式一:继承Thread创建线程

public class Hello 
{

	public static void main(String[] args) 
	{
		// 创建线程对象
		TestThread t1=new TestThread("threadA", 600);
		TestThread t2=new TestThread("threadB", 7000);
		TestThread t3=new TestThread("threadc", 900);
		//启动线程
		t1.start();
		t2.start();
		t3.start();
	}
}
class TestThread extends Thread
{
	private String threadName;
	private int ms;
	public TestThread(String threadName,int ms)
	{
		this.threadName=threadName;
		this.ms=ms;
	}
	@Override
	public void run() 
	{    //重写run()方法
		
		super.run();
		
		try 
		{
		    sleep(ms);	 //
		}
		catch (Exception e)
		{     //捕获异常
			System.out.println("the thread is error!");   
		}
		System.out.println("the thread name is:"+threadName+",sleep:"+ms+"毫秒");   
	}
	
	

}


输出结果:

the thread name isthreadB,sleep:700毫秒

the thread name isthreadc,sleep:900毫秒

the thread name isthreadA,sleep:3000毫秒

为什么不是按threadA、threadBthreadC顺序打印?其实这个就是线程的奥妙所在之处:在main()中,创建了t1t2t3三个线程并传入参数,运行到t1.start();启动线程并自动调用run()方法,在run()方法中,sleep(3000)这个方法使得t1线程暂时停止运行3000毫秒,之后线程才可以恢复运行。在t1线程休眠的时间里,把执行权主动地交给了t2t3,而不是等待t1恢复运行后再让t2t3运行。


方式二:实现Runnable接口创建线程

public class Hello 
{

	public static void main(String[] args) 
	{
		// 创建线程对象
	         RunnableTest r1=new RunnableTest();
		 r1.rOK(r1);
		 System.out.println(r1.print());
	}
}
/**
*
*来一个父类
*/
class RunnableFat   
{
    public String print()
    {
       return "i am father class of Runnable ";	
    }
}
class RunnableTest extends RunnableFat implements Runnable
{
	Thread t2=null;  //
	
	public void rOK(RunnableTest rt)   //创建一个方法
	{
		Thread t1=new Thread(rt,"firsr thread");
		System.out.println("正在运行的是:"+t1);
		
		t2=new Thread(rt,"second thread");
		System.out.println("创建 second thread");
		System.out.println("first thread 开始休眠");
		
		t2.start();   //启动t2线程
		
		try 
		{
			t1.sleep(500);  //t1线程休眠500毫秒
		} 
		catch (Exception e) 
		{
			System.out.println("first thread 错误");
		}
		System.out.println("first thread 恢复");
		
	}
	@Override
	public void run()   //重写Runnable接口的run()方法
	{
		//
		for(int i=0;i<900;i+=100)
		{
			System.out.println("second thread 休眠时间:"+i);
			try 
			{
				t2.sleep(i);
			} 
			catch (InterruptedException e) 
			{
				System.out.println("second thread 错误");
			}
			
		}
		System.out.println("second thread 结束 ");
	}
	
	
}


输出结果:

正在运行的是:Thread[firsr thread,5,main]

创建 second thread

first thread 开始休眠

second thread 休眠时间:0

second thread 休眠时间:100

second thread 休眠时间:200

second thread 休眠时间:300

first thread 恢复

i am father class of Runnable 

second thread 休眠时间:400

second thread 休眠时间:500

second thread 休眠时间:600

second thread 休眠时间:700

second thread 休眠时间:800

second thread 结束

两种方式的区别是什么?

实现Runnable接口除了拥有和继承Thread类一样的功能外,还具有以下功能:

a) 适合多个相同程序代码的线程处理同一资源的情况,可以把线程同程序中的数据有效分离,较好的体现了OOP设计思想。

b) 可以避免由于java单继承特性带来的局限。因为在java中规定了一个类只能有一个父类,不能同时有两个父类,所以只能实现Runnable接口了。   例如:class BB已经继承了class AA,假如要把BB类放入线程中去,那么就不能使用继承Thread的方式。

c) 增强了代码的健壮性。代码可以被多个线程共同访问,代码与数据是独立的。多个线程可以操作相同的数据,与它们的代码无关。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的实例。

是不是很简单?领童鞋们入门而已:)

关键靠自己!

stay hungry stay foolish


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值