当前位置: 首页 > 编程日记 > 正文

01 多线程概念及其实现方式

  • 多线程是编程过程里必不可少的内容,学习多线程,就先要了解进程和线程的概念。
  • 进程:是指当前正在运行的程序,是一个程序在内存里的执行区域;
  • 线程:是在进程里的一个执行控制单元,执行路径;

实现多线程的方式有两种,一种是继承Thread类,一种是实现runnable接口。

1.继承Thread类

a) 根据API中的描述:创建新执行线程,继承Thread类方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。

如下所示:

public class ThreadDemo extends Thread {@Overridepublic void run() {for (int i=0;i<100;i++){System.out.println(getName()+":"+i);}}
}
  • getName()  方法用于 返回该线程的名称

b) 接下来可以分配并启动该子类的实例

如下所示:

    public static void main(String[] args) {ThreadDemo xc = new ThreadDemo();xc.setName("thread1");xc.start();ThreadDemo xc2= new ThreadDemo();xc2.setName("thread2");xc2.start();}
  • setName(String name)方法可以改变线程名称,使之与参数 name 相同
  • start()   方法使该线程开始执行;Java 虚拟机调用该线程的 run 方法

2.实现runnable接口

a) API中的描述是:创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动

如下所示:

public class RunableDemo implements  Runnable {public void run() {for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName()+":"+i);}}
}
  • currentThread()我们实现了Runnable接口,接口里是没有getName方法的,所以如果我们想要获得到当前线程的基本信息,就需要用到Thread类的这个方法。API中描述:返回对当前正在执行的线程对象的引用,这个对象中是有getName()方法的。

b) 调用线程时,是使用Thread类,继承的对象作为一个参数传入

如下所示:

    public static void main(String[] args) {RunableDemo xc = new RunableDemo();Thread thread = new Thread(xc);thread.setName("thread1");thread.start();Thread thread2 = new Thread(xc);thread2.setName("thread2");thread2.start();}
  • RunableDemo 实现了Runnable接口,这个对象作为runnable类型的对象传入Thread类中
  • 最后通过start()方法进行启动,运行线程中的run()方法

在多线程中会出现需要同步操作的时候,例如扣费、减库存等,如果操作不用同步有可能导致库存为负数的情况。实现同步的方法如下:

1.同步代码块

关键字为synchronized,需要定义一把锁,这把锁需要所有的线程都共用,且锁可以为任意对象

代码如下:

//定义一把锁,在方法外以共用
Object obj = new Object();public void tongbu(){    synchronized(obj){             System.out.println("同步代码块");}      
}    

2.同步方法

关键字也为synchronized

代码如下:

public synchronized void tongbu(){            System.out.println("同步方法");    
}   

注:同步方法的synchronized 也是有锁的,非静态方法调用的是类本身(this);静态方法因为加载在实体类之前,调用不到类本身,所以用到的是字节码对象(class类)

转载于:https://www.cnblogs.com/wlym/p/9684088.html

相关文章:

负载均衡层次分析

什么是负载均衡 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;将请求/数据【均匀】分摊到多个操作单元上执行&#xff0c;负载均衡的关键在于【均匀】。 常见的负载均衡方案 常见互联网分布式架构如上&#xff0c;分为客…

Python基础01-Python环境搭建与HelloWorld

目录 从今天开始学习Python Python环境搭建 安装gcc Python源码包安装 开始Python第一个代码HelloWorld&#xff01; 从今天开始学习Python 为啥选择Python&#xff0c;可能是跟随潮流吧。我现在不知道为什么学习Python&#xff0c;但是可能一年到一年半以后&#xff0c;…

oracle与mysql创建表时的区别

oracle创建表时&#xff0c;不支持在建表时同时增加字段注释。故采用以下方式&#xff1a; #创建表 CREATE TABLE predict_data as (id integer NOT NULL, uid varchar2(80),mid varchar2(80),time date ,conten…

在Linux上安装Memcached服务

下载并安装Memcache服务器端 服务器端主要是安装memcache服务器端. 下载&#xff1a;http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz 另外&#xff0c;Memcache用到了libevent这个库用于Socket的处理&#xff0c;所以还需要安装libevent&#xff0c;libevent的最…

图形化编程 html,用GoJS实现图形化交互编程界面示例

JavaScript语言&#xff1a;JaveScriptBabelCoffeeScript确定function init() {var $ go.GraphObject.make; //for conciseness in defining node templatesmyDiagram $(go.Diagram, "myDiagramDiv", //Diagram refers to its DIV HTML element by id{"undoMan…

枚举位移计算操作

如&#xff1a; typedef NS_ENUM(NSInteger, Test) { // 十进制 二进制 TestA 1 << 0, // 1 00001 TestB 1 << 1, // 2 …

Python基础02-Python基础

脚本的第一行 Python脚本的第一行&#xff0c;写Python解释器的路径。这样就可以直接执行Python脚本。 脚本编码 Python2需要指定脚本的编码&#xff0c;Python3不需要指定。 # -*- coding:utf8 -*- 使用input做简单的交互 username input(请输入用户名密码:) password …

SpringBoot上传文件大小限制

SpringBoot默认上传文件大小不能超过1MB&#xff0c;超过之后会报以下异常&#xff1a; org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.at org.apache.tomcat.…

html实时显示log,websocketd 实现浏览器查看服务器实时日志

操作系统CentOS7下载 websocketd安装 nc 命令yum install nmap-ncat创建监听脚本cat > cmd.sh <#!/bin/bashpkill -x ncwhile :; donc -nkl 10088sleep 1done创建 log.htmlbody{background-color: #0e1012;color: #ffffff;}*{margin: 0; padding: 0;}#msg{overflow:auto;…

git 合并两个分支的某个文件

软件开发基本都是多个feature分支并行开发&#xff0c;而在上线前有可能某个分支的开发或测试还没有完成&#xff0c;又或者是产品调整&#xff0c;取消了该分支功能的上线计划&#xff0c;我们在release前不合并该分支即可&#xff0c;然而如果该分支中的某些小调整却需要上线…

lattice diamond 3.7安装破解

第一步安装&#xff1a;执行.EXE文件&#xff0c;一直下一步&#xff0c;最后license选择没有USB什么的那个&#xff08;具体记不清了&#xff09;。 第二步破解&#xff1a;安装完成后在环境变量中将license路径指定到license文件即可&#xff08;LM_LICENSE_FILE d:\lscc…

Python基础03-运算符

运算符 算数运算符 算数运算符符号运算数字用法举例字符串用法举例加a 2 3 print(a) # 5s1 "hello" s2 "world" s s1 s2 print(s) # helloworld-减a 12 - 3 print(a) # 9*乘a 12 * 3 print(a) # 36s1 "hello" s2 "world" s…

shell下的作业管理(转)

作业管理 举例来说&#xff0c;我们在登陆 bash 后&#xff0c; 想要一边复制文件、一边进行数据搜寻、一边进行编译&#xff0c;还可以一边进行 vi 程序撰写&#xff01; 当然我们可以重复登陆那六个文字介面的终端机环境中&#xff0c;不过&#xff0c;能不能在一个 bash 内达…

合并模拟器和真机的静态库动态库aggregate

创建Aggregate的target 在Build Phases 添加Run Script,内容为 scriptFile${SRCROOT}/universalA.shsh ${scriptFile} universalA.sh放在工程根目录&#xff0c;内容为&#xff1a; if [ "${ACTION}" "build" ]then echo "合并模拟器真机库" ta…

html表格联动,html前端基础:table和select操作

html前端基础&#xff1a;table和select操作发布时间&#xff1a;2020-05-13 09:58:10来源&#xff1a;亿速云阅读&#xff1a;196作者&#xff1a;Leah这篇文章主要为大家详细介绍html前端基础中有关table和select的操作&#xff0c;配合代码阅读理解效果更佳&#xff0c;非常…

Python基础04-数据类型:数字、布尔、字符串

目录 数字 布尔 字符串 字符串的常用函数 字符串的内存分析 字符串练习题 数字 判断是数字类型还是字符串类型。 # <class str> 123 a "123" print(type(a), a)# <class int> 123 b int(a) print(type(b), b) 十进制、二进制、八进制、十六进…

一起学Hadoop——实现两张表之间的连接操作

---恢复内容开始--- 之前我们都是学习使用MapReduce处理一张表的数据&#xff08;一个文件可视为一张表&#xff0c;hive和关系型数据库Mysql、Oracle等都是将数据存储在文件中&#xff09;。但是我们经常会遇到处理多张表的场景&#xff0c;不同的数据存储在不同的文件中&…

scala学习笔记-过程、lazy值和异常(6)

过程 在Scala中&#xff0c;定义函数时&#xff0c;如果函数体直接包裹在了花括号里面&#xff0c;而没有使用连接&#xff0c;则函数的返回值类型就是Unit。这样的函数就被称之为过程。过程通常用于不需要返回值的函数。 过程还有一种写法&#xff0c;就是将函数的返回值类型定…

为计算机编程序英语作文,计算机编程员英文简历范文

以下是无忧考网为大家整理的关于计算机编程员英文简历范文的文章&#xff0c;希望大家能够喜欢&#xff01;Basic information:Name: Yjb ys Gender: MaleAge: 21 Nationality: ChineseResidence: Guangdong - Huizhou height and weight: 178cm 60KGMarital status: Single Ed…

android常用命令

创建模拟器&#xff1a; 进入sdk下tool文件夹&#xff1a; cd ...../tools 检查target ID: ./android list targets 创建名为hello的AVD: ./android create avd -n hello -t 1 创建的模拟器默认在~/.android/avc/ 启动模拟器&#xff1a; ./emulator -avc hello 安装apk: 进入p…

Python基础05-数据类型:列表list

目录 列表 列表的一般用法 列表的方法 列表 列表的一般用法 列表用[]括起来&#xff0c;用逗号分隔元素。元素可以是任意的类型。 可以用len获取列表的长度&#xff0c;也就是元素的个数。 # 列表是个大杂烩&#xff0c;什么类型都可以往里面装 li [2019, 12, "存储…

h5打开App的方法。

在浏览器中&#xff1a;法1&#xff1a;location.href ${scheme};//location跳转App是几乎所以情况都支持的。法2&#xff1a;var ifr document.createElement(iframe);//iframe跳转有的地方不支持// ifr.src ${scheme};// ifr.style.display none;// document.body.append…

html作业三,3.15作业

html>科比简介div{width: 480px;height:230px;background-image:url(images/kobe.jpg);background-color:#567854;background-size:500px 250px;padding:10px;box-shaow:10px 10px 10px #666;}.text{color:#556644;text-indent: 3em;line-height: 1.4em;}科比布莱恩特 (美国…

HTML4 和 HTML5 的10个关键区别

http://www.oschina.net/news/22219/html4-html5-differences/转载于:https://www.cnblogs.com/antis/p/6708303.html

smartgit 授权文件 Free Trial License to Non-Commercial

Windows&#xff1a; %APPDATA%/syntevo/SmartGit/ OS X&#xff1a; ~/Library/Preferences/SmartGit/ Unix/Linux&#xff1a; ~/.smartgit/ and remove the file settings.xml 例如windows: 开始 运行 %APPDATA%/syntevo/SmartGit/ 就会自动找到路径删除settings.xml…

Python基础06-数据类型:元组tuple

目录 元组 元组的一般用法 元组的方法 元组 元组的一般用法 元组用()括起来&#xff0c;用逗号分隔元素&#xff0c;元素类型是任意的。因为函数、方法的调用也是用()括起来&#xff0c;为了避免混淆&#xff0c;写元组的时候&#xff0c;在最后一个元素后面多写一个逗号。…

html无规律卡片布局,如何实现同等间隙的卡片布局

在列表展示中&#xff0c;经常会使用卡片的内容展示形式&#xff0c;为了美观&#xff0c;常常要求各卡片间的间隙是一致的。卡片内容不一样可能高度不等&#xff0c;但一般来说为了整体的一致性&#xff0c;会限制每个卡片的宽高都相等。本文就基于宽高一致的多个卡片&#xf…

关于tail, head ,less ,more ,cat 之小介------Linux命令

前言&#xff1a;Linux命令在项目中是经常用&#xff0c;查看日志信息是一个不可缺少的指令。一般都是用Less&#xff0c;more,tail,head&#xff0c;cat 这些命令 目前是足够的。很久不用就会忘记。现在简单写一写。①tail 用于显示指定文件末尾内容&#xff0c;不指定文件时…

Python基础07-数据类型:字典dict

目录 字典 字典的一般用法 字典的方法 字典 字典的一般用法 字典是一组用{}括起来的键值对&#xff0c;每个键值对用逗号分隔。 # 字典 info {"Robin": "Baidu","Jack": ["Alibaba",20,{"B2C": "taobao.com&quo…

cordova 环境配制和创建插件

环境配制 英文网站&#xff1a;http://cordova.apache.org/ 中文网站&#xff1a;http://cordova.axuer.com/ 安装Cordova Cordova的命令行运行在Node.js 上面并且可以通过NPM安装。 根据 平台具体指导 安装相应平台的依赖。打开命令提示符或终端&#xff0c;然后键入npm insta…