多线程基础

一、简单概念
1、进程和线程的区别
进程:每个进程都有独立的代码和数据空间
线程:同一类线程共享代码和数据空间
多进程:是指操作系统能同时运行多个任务、并行执行方式
多线程:是指在同一个程序中有多个顺序流执行,涉及并发执行
二、实现多线程的方式
1、继承Thread类
继承Thread类需要重写run()方法,其中run()方法的方法体就是需要完成的任务。当创建这个线程对象时就会创建这个新的线程,通过调用线程的start()方法,使线程进入就绪状态。
例子

public class SonThread extends Thread {
    private String name;

    public SonThread(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + "----" + i);
        }
    }

    public static void main(String[] args) {
        SonThread st1 = new SonThread("A");
        SonThread st2 = new SonThread("B");
        st1.start();
        st2.start();
    }
}
运行结果如下图:

这里写图片描述

程序启动main()方法的时候,主线程main在main()调用的时候被创建,然后调用两个对象的start()方法,启动另外两个线程。由结果可以看出,线程执行的顺序不固定,由占用CPU资源顺序决定。
基础Thread()方法时,如果同一个对象调用两次start()方法,则会抛出异常IllegalThreadStateException
2、实现Runnable接口
实现Runnable接口也需要重写run()方法,再启动对线程的时候需要先通过Thread类的构造方法Thread(Runnable target)构造出对象,然后调用Thread对象的start()方法来运行对线程代码。
例子:

public class ImplRunnable implements Runnable {

    private int count = 0;

    @Override
    public synchronized void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + "----" + count--);
        }
        try {
            Thread.sleep(300);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ImplRunnable rable = new ImplRunnable();
        new Thread(rable).start();
        new Thread(rable).start();
    }
}

运行结果:
这里写图片描述
继承类和实现接口两种方式区别:
继承Thread类因为同一个对象两次调用start()方法会抛异常,所以不能实现资源的共享,对线程并发操作,竞争同一个对象来说,就是受到了局限,而实现Runnable接口则不会发生这种情况。总之,实现Runnable接口的形式更适合多个相同的程序代码的线程去处理同一个资源,避免java中的单继承的限制。
三、线程间的状态转换

这里写图片描述
1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

       (一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。

       (二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

       (三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
原文链接:http://blog.csdn.net/xh921/article/details/74011702

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值