文档章节

Java多线程(一)

spilledyear
 spilledyear
发布于 2017/09/08 14:22
字数 1033
阅读 3
收藏 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
粉丝 0
博文 8
码字总数 4806
作品 0
Java面试:投行的15个多线程和并发面试题

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

ImportNew
08/23
0
0
【转】15个顶级Java多线程面试题及回答

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

一只死笨死笨的猪
2014/09/30
0
0
Java多线程学习(二)synchronized关键字(2)

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

一只蜗牛呀
04/16
0
0
synchronized与ThreadLocal

synchronized是实现java的同步机制。同步机制是为了实现同步多线程对相同资源的并发访问控制。保证多线程之间的通信。 同步的主要目的是保证多线程间的数据共享。同步会带来巨大的性能开销,...

bigYuan
2013/07/18
0
2
15个顶级Java多线程面试题及回答

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

LCZ777
2014/05/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mac OS X下Maven的安装与配置

Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录。例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven classpath $ vi ~/.bash_profile 添加下列两行代码,之后...

TonyStarkSir
今天
3
0
关于编程,你的练习是不是有效的?

最近由于工作及Solution项目的影响,我在重新学习DDD和领域建模的一些知识。然后,我突然就想到了这个问题,以及我是怎么做的? 对于我来说,提升技能的项目会有四种: 纯兴趣驱动的项目。即...

问题终结者
今天
4
0
打开eclipse出现an error has occurred see the log file

解决方法: 1,打开eclipse安装目录下的eclipse.ini文件; 2,打开的文本文件最后添加一行 --add-modules=ALL-SYSTEM 3,保存重新打开Eclipse。...

任梁荣
昨天
4
0
搞定Northwind示例数据库,无论哪个版本的SQLServer都受用

Northwind数据库 从这里可以找到突破口: http://social.msdn.microsoft.com/Forums/zh-CN/Vsexpressvb/thread/8490a1c6-9018-40c9-aafb-df9f79d29cde 下面是MSDN: http://msdn2.microsoft......

QQZZFT
昨天
1
0
mysql主从同步,安装配置操作

准备 两台mysql服务,我这里准备了如下: 主库:192.168.176.128 从库:192.168.176.131 如何在Linux上安装mysql服务,请看https://blog.csdn.net/qq_18860653/article/details/80250499 操作...

小致dad
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部