zoukankan      html  css  js  c++  java
  • Java多线程系列一——Java实现线程方法

    Java实现线程的两种方法

    • 继承Thread类
    • 实现Runnable接口

    它们之间的区别如下:

    1)Java的类为单继承,但可以实现多个接口,因此Runnable可能在某些场景比Thread更适用
    2)Thread实现了Runnable接口,并且有更多实用方法
    3)实现Runnable接口的线程启动时仍然需要依赖Thread或者java.util.concurrent.ExecutorService

    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    import org.junit.Assert;
    import org.junit.Test;
    
    /**
     * @Description: 线程的两种实现方法
     */
    public class ThreadImplementTest {
        private Map<Integer, Long> map = new ConcurrentHashMap<>();
    
        class MethodOne extends Thread {
            private int count = 0;
    
            @Override
            public void run() {
                map.put(++count, this.getId());
            }
        }
    
        class MethodTwo implements Runnable {
            private int count = 0;
    
            @Override
            public void run() {
                map.put(++count, Thread.currentThread().getId());
            }
        }
    
        @Test
        public void textThread() {
            /**
             * 方法一:继承Thread
             */
            MethodOne extendsThread = new MethodOne();
            extendsThread.start();
            /**
             * 方法二:实现Runnable
             */
            MethodTwo implementsRunnable = new MethodTwo();
            new Thread(implementsRunnable).start();
        }
    
        @Test
        public void testTwoRuns() throws InterruptedException {
            /**
             * 注意:以下两种方法启动方式截然不同
             */
            Thread tmp;
            MethodOne extendsThread = new MethodOne();
            for (int i = 0; i < 3; i++) {// 只有一个线程
                tmp = new Thread(extendsThread);
                tmp.start();
                tmp.join();
            }
            Assert.assertTrue(map.containsKey(3));
            Assert.assertTrue(map.containsKey(2));
            Assert.assertTrue(map.containsKey(1));
    
            map.clear();// 清空缓存
            for (int i = 0; i < 3; i++) {// 三个不同线程
                tmp = new MethodOne();
                tmp.start();
                tmp.join();
            }
            Assert.assertEquals(1, map.size());
            Assert.assertTrue(map.containsKey(1));
        }
    }
  • 相关阅读:
    局域网搭建https局域网
    在内部局域网内搭建HTTPs
    在局域网内实现https安全访问
    http网站转换成https网站
    iis6 和iis7s上整个网站重定向
    我们在部署 HTTPS 网站时,该如何选择SSL证书?
    HTML:几个常见的列表标签
    HTML:基本的标签
    iOS: 字体样式
    iOS: 首次使用App时,显示半透明新手指引
  • 原文地址:https://www.cnblogs.com/hiver/p/7122543.html
Copyright © 2011-2022 走看看