文档章节

Java多线程(一)

spilledyear
 spilledyear
发布于 2017/09/08 14:22
字数 1033
阅读 5
收藏 0

什么是多线程

我一直都是这样理解的,多线程就是并发,不过这个并发要分几种情况:在多处理器的机器上,就是真并发;在单处理器的机器上,就是伪并发。那什么是真并发?什么是伪并发呢?

  • 真并发
    真并发就相当有好几个人同时在做一件事情,不过这几个人的分工不一样。比如说:打扫卫生就是这件事情。但是我们知道,打扫卫生是一件大事情,于是我们可以将它细分,比如说:扫地,烧水,洗衣服,倒垃圾......这个时候,每件事情都已经很清楚了,于是我们可以将这些小事情分给不同的人去做,他去倒垃圾、她去烧水,在同一时刻,他们都在处理自己的事情。在我看来,这就是真并发,因为在同一时刻,每个人都在做自己的事情,这肯定是并发嘛,对吧。
  • 伪并发
    那伪并发呢?还是打扫卫生,事情还是那么多:扫地,烧水,洗衣服,倒垃圾......不过这次只有一个人,一个人要完成所有的事情。按照一般顺序,正常情况我们是怎么做呢?是不是先扫地,然后烧水,然后洗衣服......其实这种顺序,恰好就是我们的程序在没有使用多线程时的执行顺序,就是按顺序执行。但在现实生活中很明显我们不会这样做的,现实生活中我们是怎么做的呢?我们一般会先打火烧水,然后再烧水的同时,我们去扫扫地,顺便倒一下垃圾,有时间的话再去洗一下衣服,到最后,三件事情都做好了,水也烧好了,这样是不是节约了很多时间呢?其实这种情况就很像是我们的伪并发,我们编写某个程序就是为了要完成某个某件事情,而这件事情很明显可以再细分,这时候我们可能就会用到所谓的多线程。比如说我们先通过执行main(String[] args)启动一个线程,然后在执行main方法的途中,启动了其他几个线程,最后包括main在内的这几个线程并发执行(在多处理器上真并发执行,在单处理器上伪并发执行,应该是这样吧?)。在计算机组成原理中有个时间片的概念,我不太清楚,应该就是这个道理,某个程序就是一个进程,一个进程可以由一个或多个线程组成,就相当于打扫卫生可以由扫地,烧水,洗衣服,倒垃圾组成,一个打扫卫生的人就相当于一个处理器。在多处理器上的机器上,就相当于有多个打扫卫生者,那切切实实的就是并发执行。在单处理器的机器上,因为只有一个打扫卫生者,所以操作系统会为每个线程分配不同的时间片,因为时间片的范围很小,让我们感觉是在同时执行,其实我觉得这就是伪并发。

实现多线程的两种方式

  • 实现Runnable接口,重写run方法
public class LiffOff implements  Runnable{

    private int countDown = 10;
    private static int taskCount = 0;
    private final int id = taskCount++;
    public LiffOff(int countDown){
        this.countDown = countDown;
    }
    public String status(){
       return "#" + id + "( " +(countDown > 0 ? countDown : "LiffOff") + " )";
    }

    @Override
    public void run() {
        while(countDown-- > 0){
            System.out.println(status());
            Thread.yield();
        }
    }

    public static void main(String[] args){
        LiffOff liffOff = new LiffOff(12);
        Thread thread = new Thread(liffOff);
        thread.start();

        for(int i = 0 ; i < 11 ; i++){
            System.out.println("Main 线程 " +i);
            new Thread(new LiffOff(i)).start();
        }
    }
}
  • 继承Thread类
class MyThread extends Thread{
    public static void main(String[] args){
        new MyThread().start();
    }

    public void run(){
        System.out.println("Do it");
    }
}

我推荐通过实现Runnable的方法是实现多线程,为什么?因为在Java中是单继承,如果继承了Thread类,那就不能再集成别的Class了,所以还是觉得通过实现Runnable接口来实现多线程比较好一些。

© 著作权归作者所有

共有 人打赏支持
spilledyear
粉丝 1
博文 8
码字总数 4806
作品 0
私信 提问
15个顶级Java多线程面试题及回答

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务中多...

LCZ777
2014/05/27
0
0
Java多线程学习(五)线程间通信知识点补充

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
04/16
0
0
java中高级大公司多线程面试题

1)在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它? lock接口在多线程和并发编...

java成功之路
10/30
0
0
JNI 的多线程

之前的博文中讲述了JNI的基础知识: Java 类型和C/C++类型的转换 cygwin + gcc+makeFile入门(三): JNI的编译 这两篇文章讲述了JNI最普遍的两个问题, 环境的建立以及参数的传递. JNI作为连接J...

晨曦之光
2012/03/09
1K
0
Java面试:投行的15个多线程和并发面试题

本文由ImportNew -一杯哈希不加盐 翻译自dzone。欢迎加入翻译小组。转载请见文末要求。 多线程和并发问题已成为各种 Java 面试中必不可少的一部分。如果你准备参加投行的 Java 开发岗位面试,...

ImportNew
08/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka+Flink 实现准实时异常检测系统

1.背景介绍 异常检测可以定义为“基于行动者(人或机器)的行为是否正常作出决策”,这项技术可以应用于非常多的行业中,比如金融场景中做交易检测、贷款检测;工业场景中做生产线预警;安防...

架构师springboot
11分钟前
1
0
DecimalFormat 类基本使用

/* * DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度 * 0 表示如果位数不足则以 0 填充 * # 表示只要有可能就把数字拉上这个位置 * */ public static void main(String[] args){...

嘴角轻扬30
28分钟前
3
0
This APT has Super Cow Powers.

在Debian/Ubuntu上,apt包管理器内嵌着一个彩蛋. 如果你在命令行界面输入 apt help 在最后一行能找到This APT has Super Cow Powers. 说明该apt具有超级牛力 牛力是个什么梗? 则说明你的系统...

taadis
45分钟前
2
0
起薪2万的爬虫工程师,Python需要学到什么程度才可以就业?

爬虫工程师的的薪资为20K起,当然,因为大数据,薪资也将一路上扬。那么,Python需要学到什么程度呢?今天我们来看看3位前辈的回答。 1、前段时间快要毕业,而我又不想找自己的老本行Java开发...

糖宝lsh
54分钟前
6
0
携手开发者共建云生态 首届腾讯云+社区开发者大会在京举办

本文由云+社区发表 北京时间12月15日,由腾讯云主办,极客邦科技、微信、腾讯TEG协办的首届腾讯云+社区开发者大会在北京朝阳悠唐皇冠假日酒店举办。在会上,腾讯云发布了重磅产品开发者平台以...

腾讯云加社区
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部