并发编程多线程基础一

原文链接:并发编程<多线程基础一>
2020-04-16 11:12 晴🌤


**并发编程,必须会基础点整理**

/**
 * 线程基础:
 * Created by 李泽阳 on 2020/4/15 10:20
 */
public class ThreadBasics {

     /**
     * 1、进程和线程的区别?
     * 答:进程是操作系统调度的最小单位,线程是cpu调度的最小调度单位
     * 线程共享进程的资源,例如:迅雷下载电影。。。OS限制:Linux(max)1000个,Windows(max)2000个,线程
     * 好处:充分利用cpu资源,单线程下载其他全部等待,模块化,异步化。
     * <p>
     * 2、cpu核心数和线程数的关系?
     * 答:os的超线程技术,1:2
     * <p>
     * 3、cpu时间片轮转机制?
     * 答:给每个线程分配时间片段,上下文切换,代价大:2w个cpu的周期(编写代码尽量避免)
     * <p>
     * 4、并行和并发?
     * 答:并发(单位时间内的并发量),应用并发交替使用
     * 并行(同时执行)
     * <p>
     * 5、线程的两种启动方式,Thread、runnable的区别?
     * 答:Thread是线程的抽象,runnable是具体任务的抽象
     * <p>
     * 6、线程的stop()强制终止为什么不建议使用?
     * 答:因为它的终止方式非常的野蛮,直接关闭,可能导致线程占用的锁资源不释放,形成死锁。
     * <p>
     * 7、线程run()和start()的区别?
     * 答:run(),普通方法多次调用,start()单次调用,线程就绪真正启动线程。
     * run(),主线程调用不启动子线程,start(),启动子线程
     * <p>
     * 8、内置锁的对象必须保持不变 Integer 为啥不行?
     * 答:Integer在每次返回的时候,都会创建new新的对象。
     * <p>
     * 9、为何不建议使用自定义中断?而使用interrupt()
     * 答:自定义中断,里面进行wait(),或者进行休眠,不满做条件不会出来,不会中断。
     * 而,jdk的sleep、wait 等线程继承了中断异常
     * <p>
     * 10、守护线程setDaemon(true);run()里面的finally一定执行吗?
     * 答:不一定执行,守护线程随着主线程关闭而关闭。
     * <p>
     * 11、对象锁,类锁,synchronized?是什么
     * 答:共有对象进行加锁,类锁是static的方法上枷锁,是实例创建的类锁。
     */

    //线程的实现方式,extends Thread
    public static class UsThread extends Thread {
        String threadName = Thread.currentThread().getName();
        Object obj = new Object();//内置锁,锁对象用的
        Integer integer;
       /**
         * integer  valueOf源码
         * public static Integer valueOf(int i) {
         * if (i >= IntegerCache.low && i <= IntegerCache.high)
         * return IntegerCache.cache[i + (-IntegerCache.low)];
         * return new Integer(i);
         * }
         */
        private static boolean isStop = false;//自定义中断,错误使用方法

        public static boolean isIsStop() {
            return isStop;
        }

        public static void setIsStop(boolean isStop) {
            UsThread.isStop = isStop;
        }


        @Override
        public void run() {
            //synchronized (integer) {//创建新的对象
            synchronized (obj) {//锁对象,必须保持不变
                while (!isInterrupted()) {//检查中断标识位
                   /* while (isStop) {
                        //错误使用方法,自定义boolean,错误的
                        try {
                            //等待,或者,休眠,不会感知自定义的中断位------9
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }*/
                    System.out.println(threadName);
                }
            }
        }
    }

    //线程的实现方式,implements Runnable
    public static class UsRunnable implements Runnable {
        String threadName = Thread.currentThread().getName();

        @Override
        public void run() {
            /**
             * 线程的其他操作方法
             * 1、让出线程,让出cpu的时间片段,不让其他资源
             * 2、睡眠线程
             * 3、等待线程
             * 4、加入线程
             * 5、守护线程,随着主线程进行
             */

            try {
                Thread.yield();//让出线程
                Thread.sleep(100);//线程的睡眠

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //获取当前线程进行中断
            while (Thread.currentThread().isInterrupted()) {
                System.out.println(threadName);
            }
        }
    }

    //类锁,
    public synchronized void te_Syn() {
        synchronized (this) {//对象锁
            System.out.println("");
        }

    }

    public static void main(String[] args) {
        UsThread t1 = new UsThread();
        t1.start();//方式一
        UsRunnable usRunnable = new UsRunnable();
        //匿名对象调用
        Thread t2 = new Thread(usRunnable);//方式二
        /**
         * 线程的终止
         * 1、stop()
         * 2、interrupt()、isInterrupted()、interrupted()
         * 三者区别,interrupt()线程的中断标识位,isInterrupted()检查线程的中断标识位,interrupted(),检查并修改为false
         */
        t1.stop();//强行终止,不建议使用,资源不正常释放造成死锁,过于野蛮。
        t1.interrupt();//中断线程,设置标识位将其改为true
        t2.interrupt();
        /**
         * 线程其他的方法
         */
        try {
            t1.setDaemon(true);//守护线程
            t2.join();//加入线程--之前的所以线程都加入
            t1.wait();//阻塞等待线程
            t1.setPriority(5);//线程的优先级--平均5
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章