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

    Java实现线程的两种方法

    • 继承Thread类
    • 实现Runnable接口

    它们之间的区别如下:

    • Java的类为单继承,但可以实现多个接口,因此Runnable可能在某些场景比Thread更适用
    • Thread实现了Runnable接口,并且有更多实用方法
    • 实现Runnable接口的线程启动时仍然需要依赖Thread或者java.util.concurrent.ExecutorService
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    import org.junit.Assert;
    import org.junit.Test;
    
    
    /**
     * 线程的两种实现方法
     */
    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 = 31;
            
            @Override
            public void run() {
                map.put(++count, Thread.currentThread().getId());
            }
        }
        
        @Test
        public void testThread(){
            //方法一:继承Thread
            MethodOne extendsThread = new MethodOne();
            extendsThread.start();
            
            //方法二:实现Runnable接口
            MethodTwo implementsRunnable = new MethodTwo();
            new Thread(implementsRunnable).start();
            System.out.println("ddd");
        }
        
        @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));
        }
    }
  • 相关阅读:
    vue 拖拽移动(类似于iPhone虚拟home )
    鼠标事件-MouseEvent【转】
    JS快速排序 希尔排序 归并排序 选择排序
    JS 继承
    Centos6 iptables 防火墙设置【转】
    centos6 mongodb 安装
    操作系统中涉及的各种调度算法
    循环队列
    队列
    栈(C++)
  • 原文地址:https://www.cnblogs.com/zhaoyibing/p/9569546.html
Copyright © 2011-2022 走看看