• Java多线程(一)初步了解


    1:线程

             1.1:线程是什么?线程与进程。

                       进程:正在运行的程序。windows是多进程的系统。每一个进程有自己的内存区域,也就是每个进程都会占用一定的内存。一般打开应用程序就会有进程的了。

                       线程:进程的一个分支,一个进程至少包含一个线程。一个进程就叫单线程。

    每个线程是共享一个内存区域,应该就是共享它所在进程占用的那块内存吧。如果一个程序同时做多件事件,则需要多线程。结合个人理解和网上的一些解释说下自己对多线程的理解

     1 public class SingleThreadDemo1 {
     2     public static void main(String[] args) {
     3         int i = 0, j=1;
     4         while(i<10){
     5             System.out.print(++i+" ");
     6         }
     7         add();
     8         max(i, j);
     9     }
    10     public static void add(){
    11         int i=0, j=0;
    12         for(i=0; i<10; i++,j-=i){
    13             System.out.println(i+j);
    14         }
    15     }
    16     public static boolean max(int x, int y){
    17         if(x>y){
    18             return true;
    19         }
    20         return false;
    21     }
    22 }

       首先就先看看一段代码(单线程示例-1)。虽然程序执行了两个方法和一个循环,但是这些循环和方法都是按照顺序执行的,最先的当然是程序的入口:main方法了,接下来就是一个循环,再接着是add()方法,最后就是max(int x, int y)方法。然而有没有一种方式可以让这段代码中的循环、add()、和max(int x, int y),一起(同时)执行,而不用等前面的那个执行完才能执行呢?那么答案就来了——多线程。我觉得多线程突出的就是“同时”。很多我看的一些书和视频几乎都是拿“车站售票”的例子来讲,这个挺容易理解。

             1.2:Thread类:线程类。

                       1.2.1:如何创建线程。

                                1:创建一个类继承 Thread类,重写run方法。

                                class MyThread extends Thread{

                                         public void run(){   }

                                }

                                MyThread mt = new MyThread();

                                mt.start( );//启动线程。

                                2:创建一个类实现Runnable接口。重写run方法。

                                class MyRunnable implements Runnable{

                                         public void run(){   }

                                }

                                MyRunnable mr = new MyRunnable();

                                Thread t1 = new Thread(mr);

                                t1.start();

            调用start()方法和直接调用run()方法是有很大区别的,调用start()方法是真正的达到了开启一个线程的目的,而调用run()方法只不过是普通的方法调用而已,不涉及线程的开启。

                                3:创建线程的2种方式比较

                                         优先采用实现Runnable接口。因为实现的同时还可以继承。当多个线程访问同一个资源的时候,这个时候只能采用实现。如果继承和实现都可以解决需求,建议优先使用实现。

             1.2.2:常用的方法。

                                1:start():启动线程

                                2:getName()   :如何获得当前线程的名字。默认名字为Thread-编号。main方法所在的线程;main

                                3: currentThread:当前线程的引用。静态方法。代码写在哪个线程内部就可以获得这个线程的对象。   Thread.currentThread( )

                                4:设置线程名称。

                                         4.1:创建线程对象的时候,将线程名称传给构造方法

                                         4.2:调用setName方法。设置线程名称。

                                5:获得线程的优先级   getPriority(),默认优先级为5.                      

    6:设置优先级。    setPriority( ),优先级范围1-10.优先级高的获得cpu的执行的机会会更多,但是并不能保证一定可以最先拿到cpu的执行权。

                                7:睡眠    sleep (  )

                                8:合并         join(  ) ,   哪个线程调用此方法,则这个线程先执行完。再执行其他的线程。如果线程A需要线程B的执行结果,这个时候可以在线程 A中,用线程B调用join方法。让线程B先执行完。线程A再执行。

                                9:礼让   yield()  效果不明显。

                                10:setDaemon(boolean)   :设置当前线程为守护线程或者用户线程。

                                默认情况下,线程都是为前台线程,那么所有的线程执行完,则这个进程就执行完。如果一个进程中有后台线程,当前台线程执行完后,如果后台线程没有执行完,那么这个时候后台线程停止执行,进程结束。前台线程执行完后则整个进程就会结束。也就是当进程中只剩下守护线程了没有执行完,那么不管守护线程有没有执行完,它都要停止执行了。

              11:控制线程。

                                  1:将线程设置为后台线程,

                                  2:可以用boolean 类型的变量。

                          12:中断线程 interrupt(  )

                          13:获得线程的状态   getState()

                                         new -----未启动的线程

                                         Runnable------正在执行的线程

                                         Timed-waitting----正在睡眠的状态

                                         TERMINATED ---- 已经退出的线程。

                                         BLOCK-----受阻塞的线程。未拿到锁或者未拿到cpu的线程的.

    ========================================================================

    《Java多线程(二)》

           

  • 相关阅读:
    常用正则表达式(数字、字符、固定格式)
    阿里云serverless使用笔记
    http的get请求与post请求区别
    HTTPS各版本安全策略HTTPS1_1_TLS1_0、HTTPS2_TLS1_0、HTTPS2_TLS1_2
    REST式的web服务
    JAVA Remote Object
    AJAX的核心XMLHttpRequest对象
    SQL中TOP,LIMIT,ROWNUM的用法
    半双工模式和全双工模式
    win7系统网卡驱动正常,网线连接设备正常,但电脑右下角网络图片显示一直在转圈或者显示一个黄色感叹号的解决办法
  • 原文地址:https://www.cnblogs.com/xinge1993/p/4732685.html
Copyright © 2020-2023  润新知