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));
        }
    }
  • 相关阅读:
    java多线程开发容易犯的错误
    个性化推荐系统(九)--- 电商商品个性化推荐系统
    servlet的生命周期
    Servlet的执行过程
    Tomcat发布项目的几种方式
    xml文件解析
    linux执行wget url时提示“无法建立 SSL 连接”
    Linux使用yum install 安装程序时,提示“另外一个程序锁定了 yum;等待它退出……”
    线程状态
    单例模式和多线程
  • 原文地址:https://www.cnblogs.com/zhaoyibing/p/9569546.html
Copyright © 2011-2022 走看看