今天学Java线程好了

参考:Java多线程看这一篇就足够了(吐血超详细总结)
1、线程与进程
  一个程序就是一个进程,一个进程有一至多个线程。
  进程是表示资源分配的基本单位,而线程,是进程中执行运算的最小单位,也是调度运行的基本单位。
  如图所示,Chrome、IntelliJ IDEA等,都是进程。
Windows任务管理器

2、多线程
  多线程的实现方式:1、继承Thread类;2、实现Runnable接口。两者最主要的区别在于,前者无法多继承,也就无法在多个线程间共享资源。
  Thread 类也是 Runnable 接口的子类,Thread 类的 run() 方法调用的是 Runnable 接口中的 run() 方法。
2.1、继承Thread类

public class ExtendThread extends Thread{

    @Override
    public void run(){
        System.out.println("loving u.");
    }

    public static void main(String[] args){
        ExtendThread thread = new ExtendThread();
        thread.start();
    }
}

2.2、匿名内部类

public class ImplementRunnable {


    public static void main(String[] args){
        new Thread(new Runnable(){

            @Override
            public void run(){
                System.out.println("loving u too.");
            }
        }).start();
    }
   
}

2.3、实现Runnable接口

public class ImplementsRunnable implements Runnable {

    @Override
    public void run(){
        System.out.println("implements runnable.");
    }

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

2.4、实现Callable接口

public class ImplementsCallable implements Callable<String> {

    @Override
    public String call() throws Exception{
        return "hello, implements callable";
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException{
        ExecutorService executor = Executors.newCachedThreadPool();
        Future<String> thread = executor.submit(new ImplementsCallable());
        String result = thread.get();
        System.out.println(result);
    }
}

  start()是通知程序该线程已经准备就绪(ready),直接调用run()方法即可执行该线程,注意,线程启动顺序不等同于线程调用顺序。
  线程类中的变量可以共享,也可以私有,私有即不暴露给其他线程。共享的东西,多线程访问,就会有非线程安全问题发生。
3、线程的生命周期
  线程有六个状态:新建(New)、就绪(Runnable)、超时等待(Timed_Wating)、等待(Wating)阻塞(Blocked)、终止(Terminated)。
  常在网上看到说线程有5个状态:New、Runnable、Running、Waiting、Dead。其实是把Runable拆分为Runnable和Running,Wating拆分为Timed_Wating和Waiting。
  多线程并非并行运行,而是并发。Running中的线程并非独占CPU,而是CPU在多线程之间来回切换,也就是线程其实是在Running和Blocked之间来回转换的。
  1、线程创建以后,就进入New状态;
  2、调用start()即可进入就绪(可用)状态,此时将进入线程队列排队,等待 CPU 服务;
  3、当2中线程被调用并获得处理器资源时,线程就进入到运行状态,会自动调用其run()方法;
  4、执行中线程,由于某些原因(被人为挂起或执行耗时I/O操作),会让CPU中止自己的执行,进入阻塞状态。可执行的线程,调用sleep()、suspend()、wait()等,将进入阻塞状态,此时线程不能进入排队队列,要消除阻塞后,才会转入就绪(可用)状态。
  5、线程的run()执行结束或调用stop(),线程就die了,不能再运行了。
注意:java程序运行的时候,至少启动了两个线程,java命令执行一个类时,都会启动一个JVM(OS中启动一个线程,垃圾回收),所以是两个线程:一是主线程,二是垃圾收集线程。
Java线程的六种状态转换

4、多线程常用方法说明
4.1 currentThread()
返回代码段正在被哪个线程调用的信息。
例如:Thread.currentThread().getName()
4.2 isAlive()
判断当前的线程是否处于活动状态。
例如:thread.isAlive();
4.3 sleep()
在指定的毫秒数内让当前"正在执行的线程(this.currentThread())"休眠(暂停执行)。
例如:Thread.sleep()
4.4 getId()
取得线程的唯一标识。
例如:thread.getId()
4.5 interrupt()
中断线程运行状态。
4.6 setDaemon()
将线程设置为后台线程,即使java线程结束了,它也还在后台执行。
5、线程池
6、Java线程和操作系统线程
详见:Java线程和操作系统线程的关系
7、守护线程、用户线程、主线程

展开阅读全文
©️2020 CSDN 皮肤主题: 1024 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值