文档章节

Java多线程(一)

spilledyear
 spilledyear
发布于 2017/09/08 14:22
字数 1033
阅读 3
收藏 0
点赞 0
评论 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
【转】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
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
synchronized与ThreadLocal

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

bigYuan
2013/07/18
0
2
【Java并发性和多线程】Java并发性和多线程介绍

本文为转载学习 原文链接:http://tutorials.jenkov.com/java-concurrency/index.html 译文链接:http://ifeve.com/java-concurrency-thread/ 在过去单CPU时代,单任务在一个时间点只能执行单...

heroShane
2014/01/28
0
0
java多线程之ThreadLocal

java中的java.lang.ThreadLocal,为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的局部变量。...

飞翔的兔兔
2017/07/11
0
0
Java多线程学习(四)等待/通知(wait/notify)机制

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

一只蜗牛呀
04/16
0
0
深入研究java.lang.ThreadLocal类

一、概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局...

FoxHu
2012/05/08
0
0
浅谈Java中的ThreadLocal的多线程应用问题

什么是ThreadLocal?首先要说明的一点是ThreadLocal并不是一个Thread,而是Thread的局部变量。在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了...

小欣妹妹
2017/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

20位活跃在Github上的国内技术大牛 leij 何小鹏 亚信

本文列举了20位在Github上非常活跃的国内大牛,看看其中是不是很多熟悉的面孔? 1. lifesinger(玉伯) Github主页: https://github.com/lifesinger 微博:@ 玉伯也叫射雕 玉伯(王保平),...

海博1600
2分钟前
0
0
高性能服务器本质论

一 服务器分类 从软件性能角度,高性能服务器分:cpu密集型服务器/IO密集型服务器 (1)CPU密集型:该类服务器没有对io的访问/没有同步点,性能瓶颈在于对cpu的充分利用。 典型的如转发服务器/...

码代码的小司机
4分钟前
0
0
Mybatis收集配置

一、Mybatis取Clob数据 1、Mapper.xml配置 <resultMap type="com.test.User" id="user"> <result column="id" property="id"/> <result column="json_data" property="jsonData" ......

星痕2018
29分钟前
0
0
centos7设置以多用户模式启动

1、旧版本linux系统修改inittab文件,在新版本执行vi /etc/inittab 会有以下提示 # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON......

haha360
今天
0
0
OSChina 周日乱弹 —— 局长:怕你不爱我

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ andonny :分享周二珂的单曲《孤独她呀》 《孤独她呀》- 周二珂 手机党少年们想听歌,请使劲儿戳(这里) @孤星闵月 :没事干,看一遍红楼梦...

小小编辑
今天
158
9
Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式 Factory工厂模式 Singleton单例模式 Delegate委派模式 Strategy策略模式 Prototype原型模式 Template模板模式 Spring5 beans 接口实例化 代理Bean操作 ...

小致dad
今天
0
0
SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
10
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
17
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
248
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部