• Java多线程


    Thread的start()方法

    public class ThreadTest extends Thread{
    
        public void run(){
            try {
                for(int i =0 ;i<5;i++) {
                    Thread.sleep(1000);
                    //Thread.currentThread().xxx() 表示执行当前代码的线程方法
                    //this.xxx 当前线程的方法
                    System.out.println("Thread = " + Thread.currentThread().getName());
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        public static void main(String[] args){
    
            ThreadTest th = new ThreadTest();
            th.start();
            //main也相当于一个线程
            for(int i=0;i<5;i++){
                try {
                    Thread.sleep(1000);
                    System.out.println("Thread = " + Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
            }
    
        }
    }

    执行结果

    意味着cpu执行线程的顺序是无序的,随机的

    那么start()方法对于线程的执行顺序是否有影响呢?

    public class ThreadTest extends Thread{
    
        public void run(){
            //Thread.currentThread().xxx() 表示执行当前代码的线程方法
            System.out.println("Thread = " + Thread.currentThread().getName());
        }
        public static void main(String[] args){
    
            ThreadTest th = new ThreadTest();
            ThreadTest th0 = new ThreadTest();
            ThreadTest th1 = new ThreadTest();
            ThreadTest th2 = new ThreadTest();
            ThreadTest th3 = new ThreadTest();
            th.start();
            th0.start();
            th1.start();
            th2.start();
            th3.start();
        }
    }

    结果

    欧豁,start()方法的启动顺序和最终线程的执行顺序是不同的

    看下源码public synchronized void start() {        /**         * This method is not invoked for the main method thread or "system"

             * group threads created/set up by the VM. Any new functionality added
             * to this method in the future may have to also be added to the VM.
             *
             * A zero status value corresponds to state "NEW".
             */
            if (threadStatus != 0)
                throw new IllegalThreadStateException();
    
            /* Notify the group that this thread is about to be started
             * so that it can be added to the group's list of threads
             * and the group's unstarted count can be decremented. */
            group.add(this);
    
            boolean started = false;
            try {
    start0(); started
    = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { /* do nothing. If start0 threw a Throwable then it will be passed up the call stack */ } } }

    有个start0()的本地方法,同时还有一个registerNatives()

    registerNatives()方法就是注册本地方法让Thread使用

    有个Thread.c文件

     

    vmSymbols.hpp中发现

    所以执行顺序是 start()-->start0()--->JVM_StratThread---->run()_method_name

    run()

    public class ThreadTest extends Thread{
    
        public void run(){
            for(int i=1;i<5;i++) {
                try {
                    Thread.sleep(1000);
                    System.out.println("Thread = " + Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        public static void main(String[] args){
    
            ThreadTest th = new ThreadTest();
            th.run();
    
            for(int i=1; i<5;i++){
                try {
                    Thread.sleep(1000);
                    System.out.println("Thread = " + Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    结果总共执行了8次

    所以用run()启动没有多线程的效果

    isAlive() 只有线程在启动的过程中,返回true

    getId() 获得线程的id

    getName() 获得线程名,上边的代码结果中的Thread-0就是默认的,也可以在new的时候指定线程的名字

    getPriority()和setPriority(int newPriority) 获取/设置优先级,优先级越高越容易执行,默认优先级是5,优先级可以被继承

    ----------------------------------------------------------未完待续----------------------------------------------------------------------------

  • 相关阅读:
    【NOIP 2003】 加分二叉树
    【POJ 1655】 Balancing Act
    【HDU 3613】Best Reward
    【POJ 3461】 Oulipo
    【POJ 2752】 Seek the Name, Seek the Fame
    【POJ 1961】 Period
    【POJ 2406】 Power Strings
    BZOJ3028 食物(生成函数)
    BZOJ5372 PKUSC2018神仙的游戏(NTT)
    BZOJ4836 二元运算(分治FFT)
  • 原文地址:https://www.cnblogs.com/fjd-1004/p/11020518.html
Copyright © 2020-2023  润新知