zoukankan      html  css  js  c++  java
  • java多线程学习一

    声明:本篇博客是本人为了自己学习保存的心得,其内容主要是从大神——五月的仓颉的博客中学习而来,在此多谢大神五月的仓颉的分享,敬礼!

    第一章:进程和线程的概念

    进程:进程是操作系统中作为分配资源的基本单位,计算机系统上的每一个运行的程序都需要一个进程,而每一个进程的运行需要new一块内存,然后操作系统会把一块物理内存映射到这个进程的地址空间;

    线程:线程作为独立运行和独立调度的基本单位,进程中每一个独立的子任务就是一个线程。本博主要讲线程(基于java)

    下面是一个demo:

    第一种方式、创建一个线程,继承 Thread

     1 public class MyThread extends Thread {
     2     public void run(){
     3         for (int i = 0; i <5; i++) {
     4             try {
     5                 Thread.sleep(1000);
     6                 System.out.println(Thread.currentThread().getName());
     7             } catch (InterruptedException e) {
     8                 // TODO Auto-generated catch block
     9                 e.printStackTrace();
    10             }
    11         }
    12     }
    13 }

    编写一个main()方法

    public class Test {
        
        public static void main(String[] args) {
            MyThread myThread = new MyThread();
            myThread.start();
            for (int i = 0; i <5; i++) {
                try {
                    Thread.sleep(500);
                    System.out.println(Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    
    }

    运行结果

    main
    main
    Thread-0
    main
    Thread-0
    main
    main
    Thread-0
    Thread-0
    Thread-0

    我们可以通过上面的demo了解到线程是互相独立的,main线程和Thread-0线程交替运行,其实就是同时运行互不干扰,也就是说一个线程的执行不用等待另一个线程执行完后再执行,这样就大大提高了服务器资源的利用率。

    第二种、创建线程的方式是实现Runnable接口,看源码我们可以发现其实 Thread 也实现了Runnable接口,因此实现了Runnable接口后,我们还是需要Thread俩启动线程,如下:

    MyThread01 mt0 = new MyThread01();
    Thread t = new Thread(mt0);
    t.start();

    以上两种方式对比,相对来说实现Runnable接口的方式相对好一些,原因:继承是单继承,实现可以多实现,并且实现可以减少程序之间的耦合度。

    下面是笔者总结的线程的六种状态:

    1、新建状态NEW

    new了但是没有启动的线程的状态。比如"Thread t = new Thread()",t就是一个处于NEW状态的线程

    2、可运行状态RUNNABLE

    new出来线程,调用start()方法即处于RUNNABLE状态了。处于RUNNABLE状态的线程可能正在Java虚拟机中运行,也可能正在等待处理器的资源,因为一个线程必须获得CPU的资源后,才可以运行其run()方法中的内容,否则排队等待

    3、阻塞BLOCKED

    如果某一线程正在等待监视器锁,以便进入一个同步的块/方法,那么这个线程的状态就是阻塞BLOCKED

    4、等待WAITING

    某一线程因为调用不带超时的Object的wait()方法、不带超时的Thread的join()方法、LockSupport的park()方法,就会处于等待WAITING状态

    5、超时等待TIMED_WAITING

    某一线程因为调用带有指定正等待时间的Object的wait()方法、Thread的join()方法、Thread的sleep()方法、LockSupport的parkNanos()方法、LockSupport的parkUntil()方法,就会处于超时等待TIMED_WAITING状态

    6、终止状态TERMINATED

    线程调用终止或者run()方法执行结束后,线程即处于终止状态。处于终止状态的线程不具备继续运行的能力

  • 相关阅读:
    AngularJs 与Jquery的对比分析,超详细!
    身份证号验证,获取户口地址、性别、出生日期
    前端面试·
    页面可见性(Page Visibility API) 可以有哪些用途?
    webSocket如何兼容低浏览器?(阿里)
    如何实现浏览器内多个标签页之间的通信?
    HTML5的form如何关闭自动完成功能?
    Label的作用是什么?是怎么用的?
    cookies,sessionStorage 和 localStorage 的区别?
    浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢?
  • 原文地址:https://www.cnblogs.com/bestxyl/p/8664969.html
Copyright © 2011-2022 走看看