黑马程序员——java基础拾遗之多线程(一) 多线程的两种实现

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

        多线程是java中的重要知识点,很常用,而且难点集中,使用多线程的水平怎么样是java开发水平的重要标志,所以这个知识点需要好好掌握。
        我在这里整理下多线程的知识点以及一些注意事项,让自己能够更好的掌握这个知识点。

线程的概念:是程序执行流的最小单元。

线程的状态

1.新建状态(New Thread):new 出一个Thread对象的时候该线程的状态;
2.就绪状态(Runnable) 调用过start()方法,具备执行条件的线程,只要分配到了CPU的时间片就能立即执行;
3.运行状态(Running)正在执行的线程;
(第二和第三中状态统称可运行态)
4.阻塞状态(Blocked)线程停止,等待被事件唤醒的状态,一般以下种事件会造成线程阻塞:

         1)suspend()方法被调用;
         2)sleep()方法被调用;
         3)线程使用wait()来等待条件变量;
         4)线程处于I/O请求的等待。
 
         当以下事件发生的时候,线程被唤醒,重新变为可运行态:
         1)sleep()指定的时间到;
         2)resume() 方法调用,与suspend()配套;
         3)notify() 方法调用,与wait() 配套使用;
         4)I/O 完成

5.死亡状态(Dead):当run()方法返回,或别的线程调用stop()方法,线程进入死亡态,线程结束。


线程的集中状态变迁可以通过这个图来理解,其中 Runnable 状态包含了上面讲的就绪和运行两种情况,没有做区分。

创建线程的两种方式:

1. 将类声明为 Thread 的子类,重写run()方法,之后调用实例的start()方法,从而执行线程;
2. 实现Runnable接口


继承的方式:

步骤:

1.定义类继承Thread类
2.重写run()方法,其中编写线程要执行的代码
3.将类实例化并调用start()方法.


示例代码:

<span style="font-size:14px;">class ThreadDemo extends Thread
{
    public void run() {
        for (int i = 0; i < 60; i++) {
            System.err.println("this is thread!" + i);
        }
    }
}


public class ThreadTest
{
    public static void main(String[] args) {
        ThreadDemo t = new ThreadDemo();
        t.start();// 开启线程并执行run,否则直接调用run不会开启线程
    }
}</span>


注意:执行start()开启线程,如果直接调用run()不会开启线程。

实现Runnable接口的方式:

步骤:

1.定义类,实现Runnable接口
2.覆盖Runnable接口中的run方法(将线程要执行的代码放在run方法中)
3.通过Thread类建立线程对象
4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数
(让线程和自定义的要多线程执行的内容建立联系)
5.调用Thread类的start()方法开启线程并调用Runable接口子类的run方法


这里用经典的买票代码来演示实现Runnable接口的方式
<span style="font-size:14px;">class Ticket implements Runnable
	{
	    private int ticket = 100;
	    public void run(){
	        while(ticket > 0){
	            System.out.println(Thread.currentThread().getName()+"sell the ticket " + ticket--);
	        }
	    }
	}
		
	public class ThreadRunableTest
	{
	    public static void main(String[] args) {
	        Ticket t = new Ticket();
	        Thread t1 = new Thread(t);
	        Thread t2 = new Thread(t);
	        Thread t3 = new Thread(t);
	        Thread t4 = new Thread(t);
	        t1.start();
	        t2.start();
	        t3.start();
	        t4.start();
	    }
	}</span>
四个窗口卖100张票

继承Thread类和实现Runable接口两种方式的区别:

1.一旦继承Thread,就无法继承其他类,因此不够灵活。继承Thread的方式在实际应用过程中太过局限,因此不常用。
2.实现方式避免了单继承的局限性,在实际使用中常用这种方式。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值