• 多线程入门(一)


    一、我们如何实现多线程的程序?


     * 由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。
     * 而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程。
     * Java是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序。
     * 但是呢?Java可以去调用C/C++写好的程序来实现多线程程序
     * 由C/C++去调用系统功能创建进程,然后由Java去调用这样的东西,

     * 然后提供一些类供我们使用。我们就可以实现多线程程序了。


    二、那么Java提供的类是什么呢?


     Thread类


     方式1:继承Thread类。
     * 步骤
     * A:自定义类MyThread继承Thread类。
     * B:MyThread类里面重写run()
     * run()方法里面是线程体代码
     * C:创建对象
     * D:启动线程


    public class MyThreadDemo {
    	public static void main(String[] args) {
    		// 创建线程对象
    		// MyThread my = new MyThread();
    		// // 启动线程
    		// my.run();
    		// my.run();
    		// 调用run()方法为什么是单线程的呢?
    		// 因为run()方法直接调用其实就相当于普通的方法调用,所以你看到的是单线程的效果
    		// 要想看到多线程的效果,就必须说说另一个方法:start()
    		// 面试题:run()和start()的区别?
    		// run():仅仅是封装被线程执行的代码,直接调用是普通方法
    		// start():首先启动了线程,然后再由jvm去调用该线程的run()方法。
    		// MyThread my = new MyThread();
    		// my.start();
    		// // IllegalThreadStateException:非法的线程状态异常
    		// // 为什么呢?因为这个相当于是my线程被调用了两次。而不是两个线程启动。
    		// my.start();
    
    		// 创建两个线程对象
    		MyThread my1 = new MyThread();
    		MyThread my2 = new MyThread();
    
    		my1.start();
    		my2.start();
    	}
    }


    三、如何获取线程对象的名称呢?


    public final String getName():获取线程的名称。


    在run()方法体里调用此方法将显示 :Thread-? 

    那么名称为什么(默认)是:Thread-? 呢??


    --看Thread与名字相关源码,如下:


    class Thread {
        private char name[];
    
        public Thread() {
            init(null, null, "Thread-" + nextThreadNum(), 0);
        }
        
        private void init(ThreadGroup g, Runnable target, String name,
                          long stackSize) {
            init(g, target, name, stackSize, null);
        }
        
         private void init(ThreadGroup g, Runnable target, String name,
                          long stackSize, AccessControlContext acc) {
            //大部分代码被省略了
            this.name = name.toCharArray();
        }
        
        public final void setName(String name) {
            this.name = name.toCharArray();
        }
        
        
        private static int threadInitNumber; //0,1,2
        private static synchronized int nextThreadNum() {
            return threadInitNumber++; //return 0,1
        }
        
        public final String getName() {
            return String.valueOf(name);
        }
    }

    如何设置线程对象的名称呢?
     * public final void setName(String name):设置线程的名称
     * 
    不是Thread类的子类中如何获取线程对象名称呢(比如main线程)?
     * Thread.currentThread().getName()即可


  • 相关阅读:
    leetcode32 Longest Valid Parentheses 最长有效括号序列
    js的Prototype属性
    一道区间dp和一道字符串
    Cookie和Session
    JS选择器querySelector和~All,三个原生选择器
    module.exports和exports
    Windows7环境下MongoDB安装和配置
    转载:Ajax基础详解&&http填坑2
    Node后台刷评论
    Node 简单爬虫
  • 原文地址:https://www.cnblogs.com/chz-blogs/p/9381001.html
Copyright © 2020-2023  润新知