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

线程、线程匿名内部类、解决线程不安全的方式

线程

线程:正在运行的程序,是程序的执行路径;多线性

进程:是应用程序的载体,程序运行在虚拟机中。一个应用软件对应一个进程。

一个进程包含多个线程,一个线程对应一个进程。

好处:提高软件的运行效率

多线程的运行原理

在同一时刻只能有一个线程正在使用CPU,操作系统设计了CPU的调度方式。

  • 分时调用:平均分配使用CPU的使用时间
  • 抢占式调度:根据线程的优先级分配CPU资源

开发多线程的方式

  • 继承Thread类
  • 实现Runnable接口

Thread类

构造方法:

成员方法:
- int getPriority() 返回线程的优先级。
- String getName() 返回该线程的名称。
- void run()运行线程逻辑的代码
- void start()开启线程,使线程处于就绪状态,等待CPU的调度。

线程使用

定义子线程类(继承Thread或者实现Runable接口),重写run()方法。

创建线程对象,调用start()方法。

子线程

public class DemoThread extends Thread {public DemoThread(){}public DemoThread(String name){super(name);}@Overridepublic void run() {Thread demo = Thread.currentThread();String demoName = demo.getName();System.out.println(demoName);}}

主线程

public class DemoMain {public static void main(String[] args) {Thread main = Thread.currentThread();String mainName = main.getName();System.out.println(mainName);//创建子线程的对象DemoThread dt=new DemoThread("我是子线程");dt.start();System.out.println("主线程");}
}

实现Runnable接口

  1. 定义类实现Runnable接口,重写run()方法(线程执行的代码)
  2. 创建子线程任务对象
  3. 创建子线程对象
  4. 调用start()方法。

子线程

public class DemoRunable implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName());}}

主线程

public class MainRunnable {public static void main(String[] args) {//创建子任务DemoRunable dr=new DemoRunable();//创建子线程对象Thread td=new Thread(dr,"子线程");td.start();}
}

两种方式的区别

  1. 继承Thread类, 任务与子线程代码 耦合(关联性)到一起。
  2. 实现Runnable接口,把任务代码和子线程的代码分开(解耦性强)
  3. 继承扩展性差、不能继承其他的父类,只能继承一个父类。

线程匿名内部类使用

/***只调用一次线程* @author YandeHu**/
public class DemoInner {public static void main(String[] args) {new Thread(){@Overridepublic void run() {System.out.println(Thread.currentThread().getName());System.out.println("Thread继承子线程匿名内部类的代码");}}.start();Runnable r=new Runnable(){@Overridepublic void run() {System.out.println("Runnable1 匿名自内部对象");}};Thread td=new Thread(r);td.start();new Thread(new Runnable(){@Overridepublic void run() {System.out.println("Runnable2 匿名自内部对象");}}).start();}
}

解决线程不安全的方式

保证修改共享数据的代码在同一时刻只能一个线程访问,保证线程是同步的。

  1. 使用同步代码块

    1. 使用关键字 syncronized 修改共享代码块
    2. 同步:代码一行一行的往下执行
    3. 异步:多个线程同时执行
    4. 锁对象:任意的对象类型 ,只有线程拿到此对象,才能执行代码。

    public class TiketRunnable implements Runnable {

    int tiketNumber=100;
    //锁对象 只有获得锁对象的线程才可以执行
    Object obj=new Object();
    @Override
    public void run() {while(true){synchronized (obj) {if(tiketNumber>0){try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("线程"+Thread.currentThread().getName()+" 正在卖"+(tiketNumber--)+"张票");}}}}}
    

Lock接口

Lock lock=new ReentrantLock();//重写run方法
public void run() {lock.lock();同步代码lock.unlock();}

Lock lock=new ReentrantLock();
@Override
public void run() {while(true){lock.lock();if(tiketNumber>0){try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("线程"+Thread.currentThread().getName()+" 正在卖"+(tiketNumber--)+"张票");}lock.unlock();}

相关文章:

工作流编程循序渐进(9:使用本地服务在宿主和工作流之间通信)

工作流编程循序渐进(9:使用本地服务在宿主和工作流之间通信) 作者 朱先忠 [摘要]在本篇中,首先详细分析本地服务有关概念,探讨本地服务在工作流运行时、工作流实例及工作流宿主间的地位及作用…

使用Properties连接数据库

使用Properties连接数据库 要注意的是: 1.通过配置文件来连接数据库时,连接信息要以 mysql.XXX开头,否则会提示异常。 java.sql.SQLException: Access denied for user localhost (using password: YES)生成配置文件的实现代码 1、创建写入配置信息工…

两边横线,中间标题

<!DOCTYPE html> <html> <head> <title>两边横线&#xff0c;中间标题</title> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <style type"text/css"> <!--ul { mar…

交换机基础配置

请同学们下载附件中的实验并完成。转载于:https://blog.51cto.com/coffee0546/204093

python高级-模块(14)

一、python中的模块 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数&#xff0c;必须用语句#include <math.h>引入math.h这个头文件&#xff0c;否则是无法正常进行调用的。 那么在Python中&#xff0c;如果要引用一些其他的函数&#xff0c;该怎么处理呢&am…

RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列

上一篇已经讲了Rabbitmq如何在Windows平台安装&#xff0c;不懂请移步&#xff1a;RabbitMQ学习系列一&#xff1a;windows下安装RabbitMQ服务 一、理论&#xff1a; .net环境下&#xff0c;C#代码调用RabbitMQ消息队列&#xff0c;本文用easynetq开源的.net Rabbitmq api来实…

一步步学会使用ASP.NET 4 WEB应用程序中使用URL Routing(翻译)

创建路由 路由就是将URL路径映射到具体的物理文件。若要将路由添加到网站中&#xff0c;请使用 RouteCollection.MapPageRoute 方法将它们添加到RouteTable类的静态Routes属性。 将用于添加路由的方法添加到 Global.asax 文件中 如果网站还没有 Global.asax 文件&#xff0c;…

Properties持久的属性集

Properties 属性集合继承了Hashtable 属性包括属性名和属性值&#xff08;键值对keyvalue&#xff09; 作用 可以存储多个键值&#xff0c;与map相似可以把键值对存储到文件中可以把文件中的键值对读取到Properties对象中 构造方法&#xff1a; Properties() 创建一个无默认…

让你二十年后仍是人才

1.不管坐什么位置&#xff0c;都要保持学习的习惯出社会工作十年到十五年左右&#xff0c;会有一种「上下卡住」的闭塞感与无力感。因为&#xff0c;这个阶段的上班族虽然拥有一定的资历与经验&#xff0c;工作也得心应手&#xff0c;但上面有比自己更资深的前辈压着&#xff0…

Django ORM操作

Django ORM操作 一般操作 看专业的官网文档&#xff0c;做专业的程序员&#xff01; 必知必会13条 <1> all(): 查询所有结果<2> get(**kwargs): 返回与所给筛选条件相匹配的对象&#xff0c;返回结果有且只有一个&#xff0c;如果符合筛选…

ChineseCalendar类[转]

///<summary>///Title: ChineseCalendar类 ///Description: 中文日期工具类 ///author 万灵杰[作者] ///version 1.0.0.0 ///date 2009年7月30日 ///modify ///date ///</summary>publicclassChineseCalendar { privatestaticrea…

程序员的自我救赎---13.1:职场招聘与面试心得

《前言》 《目录》 &#xff08;一&#xff09; Winner2.0 框架基础分析 &#xff08;二&#xff09;PLSQL报表系统 &#xff08;三&#xff09;SSO单点登录 &#xff08;四&#xff09; 短信中心 &#xff08;五&#xff09;钱包系统 &#xff08;六&#xff09;GPU支付中心 &…

网络编程 UDP通信的过程 TCP通信过程 多线程文件上传

网络概述 协议 在网络之间传出数据时需要按照指定的标准来传输&#xff0c;标准中规定了数据的格式、大小、传输的方式、传输速率。形成统一规范—>按照规范开发的代码—>协议&#xff08;应用层、传输层、网络层、链路层&#xff09; InetAddress类 用来分装网络地址…

set debug mode for flex builder

1. 要具备debug功能&#xff0c;我们必须要首先安装Flash Player Debug 版本。windows版本2. 安装好debug版本后&#xff0c;我们还需要添加日志的配置文件mm.cfg。该配置文件存放的目录如下&#xff1a;Macintosh OS X MacH D:Library:Application Support:macromedia:mm.cfgM…

XML 解析XML文档 XML约束

XML 什么是XML Extensible Markup Language&#xff08;可扩展的标记语言&#xff09;他是一个语言&#xff0c;有自己的语法&#xff0c;和Java以及其他的编程无关“标记” 在文件中包含类似于张三 &#xff0c;这种用尖括号括起来的叫标记&#xff0c;使用来标记数据的。标…

Host Only、NAT和Bridge三种网络连接

Host Only、NAT和Bridge三种网络连接 在安装好了Linux镜像之后&#xff0c;如何连接物理机和虚拟机呢&#xff1f;这就需要网络连接&#xff0c;网络连接有三种&#xff1a;HostOnly、NAT、Bridge&#xff0c;它们都可用于Guest虚拟机和Host物理机之间的网络通信。 一、三者的不…

OSPF 提升 一 ----基础

ospf ccnp内容 一 link-state protocols IGP 开放式的最短路径优先协议 公有协议支持中到大型的网络 spf算法 链路状态协议1.传送的LSA link status advertisement 链路状态通告 包换拓扑信息具体包括&#xff1a;网段的前缀 掩码 连接的路由器的…

C#实现网页截图功能

//需要添加System.Drawing及System.Windows.Forms引用 using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Windows.Forms; namespace 网页截图 { class Program { [S…

微软发布全新多核心操作系统原型:Barrelfish

Windows 7完成之后&#xff0c;很多人开始把目光投向微软的下一代服务器和客户端操作系统Windows 8&#xff0c;不过今天微软放出了一套全新操作系统的原型&#xff0c;开发代号“Barrelfish”。该系统由微软剑桥研究院和苏黎世理工学院联合全新开发&#xff0c;专为现在和未来…

Docker应用:Kubernetes(容器集群)

Docker应用&#xff1a;Kubernetes&#xff08;容器集群&#xff09; 原文:Docker应用&#xff1a;Kubernetes&#xff08;容器集群&#xff09;阅读目录&#xff1a; Docker应用&#xff1a;Hello WorldDocker应用&#xff1a;Docker-compose&#xff08;容器编排&#xff09;…

通道应用——抠头发

通道应用——抠头发 原图&#xff1a; 效果图&#xff1a; 步骤&#xff1a;1、打开原图的“通道面板”&#xff0c;选择颜色对比分明的绿色通道&#xff0c;并新建一个绿色通道副本&#xff1b;2、选择“图像”-“调整”-“色阶”&#xff0c;调节色阶使得头发颜色更分明些&am…

2017 ACM/ICPC 南宁赛区小结 By JSB @ Reconquista

Statistics TYPE: Onsite ContestNAME: 2017 - ICPC - Asia NanningPLAT: pc^2TIME: 2017/11/26 09:00-14:00LOCA: Guangxi UniversityTEAM: Reconquista[shb,lsmll,jsb]RANK: 8/227 3.52%SOLVE: 8/13PENALTY: 451 ◦ A - 1 ◦ E - 123 (2) ◦ F - 8 ◦ H - 55 ◦ I - 97 (1) ◦…

用户管理系统控制台版连接数据库

建User表 CREATE TABLE user (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) DEFAULT NULL,pwd VARCHAR(20) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEINNODB AUTO_INCREMENT5 DEFAULT CHARSETutf8User对象&#xff08;javaBean&#xff09; public class User {priva…

微信小程序组件 日历

js文件 use strict;let choose_year null,choose_month null;const conf {data: {hasEmptyGrid: false,showPicker: false},onLoad() {const date new Date();const cur_year date.getFullYear();const cur_month date.getMonth() 1;const weeks_ch [ 日, 一, 二, 三, …

node编写定时任务,for循环只执行一遍的解决办法

在用node编写定时任务时候&#xff0c;发现for循环只执行i0这一次&#xff0c;就不接着循环执行了&#xff0c;下面贴上代码&#xff1a; exports.task async function(ctx){ let { app } ctx, resultArr1 [],//查询的数据库数据 resultArr2 [];//查询的数据库…

oledb读不到dbf文件内容

最近在处理一批VFP的数据库&#xff0c;使用OleDB方式读取一直很正常&#xff0c;前两天突然碰到一张表怎么也读不出数据来&#xff0c;害我瞎忙了一整天&#xff0c;在研究了DBF文件结构后发现记录前的0x20位置存储的是0x2A。 一查才知道是删除标记&#xff0c;我倒&#xff0…

好用的截图工具

好用的截图工具...简单好用而且不大转载于:https://blog.51cto.com/dd123/208983

“AS3.0高级动画编程”学习:第二章转向行为(上)

因为这一章的内容基本上都是涉及向量的&#xff0c;先来一个2D向量类&#xff1a;Vector2D.as (再次强烈建议不熟悉向量运算的童鞋&#xff0c;先回去恶补一下高等数学-07章空间解释几何与向量代数.pdf) package {import flash.display.Graphics;public class Vector2D {privat…

用Azure VM + Azure Database for MySQL搭建Web服务

仍然是一篇动手实验&#xff0c;实验演示如何在Azure的虚拟机内部署一个Web服务器&#xff0c;并且使用Azure Mysql PaaS作为本应用的数据库。此实验的目的一方面是为了演示Azure IaaS层和PaaS服务配合使用的常规操作&#xff0c;另一方面是为之后的文章打基础&#xff0c;后续…

C3P0_and_pro.properties配置文档代码

C3P0-config.xml配置文件 <c3p0-config> <!-- 默认配置&#xff0c;如果没有指定则使用这个配置 --> <default-config><property name"driverClass">com.mysql.jdbc.Driver</property><property name"jdbcUrl">jdbc:…