Java线程:概念与原理_weixin_34138255的博客-程序员秘密

技术标签: java  操作系统  

一、操作系统中线程和进程的概念


现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。

进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。

线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。

同时执行是人的感觉,在线程之间实际上轮换执行。

二、Java中的线程


Java中,线程指两件不同的事情:
1
java.lang.Thread类的一个实例;

2、线程的执行。

使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程

一个Thread类实例只是一个对象,像Java中的任何其他对象一样,具有变量和方法,生死于堆上。

Java中,每个线程都有一个调用栈,即使不在程序中创建任何新的线程,线程也在后台运行着。

一个Java应用总是从main()方法开始运行,mian()方法运行在一个线程内,它被称为主线程。

一旦创建一个新的线程,就产生一个新的调用栈。

线程总体分两类:用户线程和守候线程。

当所有用户线程执行完毕的时候,JVM自动关闭。但是守候线程却不独立于JVM,守候线程一般是由操作系统或者用户自己创建的

Java线程:创建与启动

一、定义线程

 

1、扩展java.lang.Thread类。

 

此类中有个run()方法,应该注意其用法:

public void run()

如果该线程是使用独立的Runnable运行对象构造的,则调用该Runnable对象的run方法;否则,该方法不执行任何操作并返回。

 

Thread的子类应该重写该方法。

2、实现java.lang.Runnable接口。

 

void run()

使用实现接口Runnable的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的run方法。

 

方法run的常规协定是,它可能执行任何所需的操作。

 

二、实例化线程

 

1、如果是扩展java.lang.Thread类的线程,则直接new即可。

 

2、如果是实现了java.lang.Runnable接口的类,则用Thread的构造方法:

Thread(Runnable target) 
Thread(Runnable target, String name) 
Thread(ThreadGroup group, Runnable target) 
Thread(ThreadGroup group, Runnable target, String name) 
Thread(ThreadGroup group, Runnable target, String name, long stackSize)

 

三、启动线程

 

在线程的Thread对象上调用start()方法,而不是run()或者别的方法。

 

在调用start()方法之前:线程处于新状态中,新状态指有一个Thread对象,但还没有一个真正的线程。

 

在调用start()方法之后:发生了一系列复杂的事情

启动新的执行线程(具有新的调用栈);

该线程从新状态转移到可运行状态;

当该线程获得机会执行时,其目标run()方法将运行。

 

注意:对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。

四、例子

1、实现Runnable接口的多线程例子

/** 
* 实现Runnable接口的类
* 
* @author leizhimin 2008-9-13 18:12:10 
*/ 
public class DoSomethingimplements Runnable {
    private String name;

    public DoSomething(String name) {
        this.name = name;
    } 

    public void run() {
        for (int i = 0; i < 5; i++) {
            for (long k = 0; k < 100000000; k++) ;
            System.out.println(name + ": " + i);
        } 
    } 
}
publicclass TestRunnable {
    publicstaticvoid main(String[] args) {
        DoSomething ds1 = new DoSomething("阿三");
        DoSomething ds2 = new DoSomething("李四");

        Thread t1 = new Thread(ds1);
        Thread t2 = new Thread(ds2);

        t1.start(); 
        t2.start(); 
    }


转载于:https://my.oschina.net/stuka/blog/643716

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34138255/article/details/91704585

智能推荐

a股下单接口与通达信接口有什么不同?_a股接口的博客-程序员秘密

数据获取接口一般返回list结构,如果需要转化为pandas Dataframe接口,可以使用 api.to_df 进行转化。综上所述就是关于a股下单接口与通达信接口之间的一个区别。# 返回DataFrame。# 返回普通list。

C语言版扫雷_c语言 扫雷_Foreordination_的博客-程序员秘密

用C语言实现扫雷,首先应该有基本的思路,创建两个相同大小的数组,一个用于布雷(初始化为全0,布雷时将雷置为1),另一个给用户展示(初始化为星号,用户输入坐标后统计周围雷的分布并打印雷的个数)。由于需要统计每个坐标周围类的个数,所以将数组创建大一圈,以方便统计。若输了,打印出雷阵告诉玩家雷的分布。具体实现:game.h文件#ifndef __GAME_H__#define __GAME

[分布式]高并发案例---库存超发问题_走在小路的博客-程序员秘密

1. 库存超发的原因是什么?在执行商品购买操作时,有一个基本流程: 例如初始库存有3个。第一个购买请求来了,想买2个,从数据库中读取到库存有3个,数量够,可以买,减库存后,更新库存为1个。接下来第二个购买请求来了,想买2个,发现库存为1,不够,不可以买了。这样是没问题的,但在高并发情况下,这2个购买请求很可能是一起来的,他们都读到库存是3,都可以买,就都去减库存,这时超...

开放共赢,华为云WeLink生态联盟正式成立!_CSDN云计算的博客-程序员秘密

今日,华为在京发布了“更懂企业”的智能工作平台华为云WeLink,并携手合作伙伴成立华为云WeLink生态联盟。其中首批加入华为云WeLink生态联盟的伙伴主要包括(排名不分先后):金山办公、中软国际、致远互联、罗技、华为商旅、红圈营销、合思费控、Coremail论客、芯盾集团、目睹直播、视源股份、喜马拉雅、为知笔记等。对于此软国际高级副总裁曹雁在发布会做了主题分享,她介绍华为云WeLink帮...

Android 代码设置Color的几种方式_weixin_37716758的博客-程序员秘密

系统自带的颜色类tx.setTextColor(android.graphics.Color.RED);利用数字设置tx.setTextColor(0xffff00f);利用xml中已经定义好的颜色代码tx.setTextColor(getResources().getColor(R.color.red));利用16进制 字符串tx.setTextColor(Color.parse...

随便推点

Java面试题总结_weixin_34194551的博客-程序员秘密

1、面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继...

VMware 修复 vCenter 服务器中的严重 RCE 漏洞_奇安信代码卫士的博客-程序员秘密

聚焦源代码安全,网罗国内外最新资讯!作者:Pierluigi Paganini编译:奇安信代码卫士团队VMware 修复 vCenter Server 虚拟基础设施管理平台中的一个严重远...

org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat_小王曾是少年的博客-程序员秘密

启动Spring-cloud的eureka服务器时报了一个找不到Tomcat的错误:org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat原因是在eureka的pom文件里引入dependency时把guava排除掉了,去掉这部分内容即可...

svn安装与注意事项_小鲍侃java的博客-程序员秘密

1.下载软件包点击安装(一直下一步就可以了)注意 第二个选项要选中安装完成有两点要注意:1:上文提示要勾选的一定勾选上,否则ide中不能够使用svn2:不建议在D:,F:盘符下直接拉取!!!!!需要新建文件夹后再拉取...

VMware虚拟化环境无法重命名VMware ESXi/ESX 中的虚拟机及其文件的问题解决_weixin_33705053的博客-程序员秘密

在使用 vSphere Client 登录到VMware ESXi/ESX或vCenter在清单中重命名虚拟机时默认只会更改显示名称,而不会更改数据存储中的对应文件(或者只能重命名文件夹名称,不能重命名其中的文件)。但只有同时重命名存储中的虚拟机的目录名称(文件夹名称)和文件后才能保持与清单中虚拟机的名称的一致性。这对于后期查找虚拟机的配置文件是非常必要的。因为一旦从清单中移...

C语言 | strcat-strncat-strcmp-strcpy-strncpy-strncpy_s-memcpy_张登雨的博客-程序员秘密

文章目录1、strcat描述声明参数返回值实例2、strncat描述声明参数返回值实例3、strcmp描述声明参数返回值实例4、strcpy描述声明参数返回值实例5、strncpy描述声明参数返回值实例6、strncpy_s7、memcpy描述声明参数返回值实例1、strcatC 标准库 - &lt;string.h&gt;描述C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。声明下面