java中多线程 - 多线程中的基本方法

介绍一下线程中基本的方法使用

线程睡眠sleep()

Thread.sleep(毫秒);我们可以通过sleep方法设置让线程睡眠。可以看到sleep是个静态方法

public static native void sleep(long var0) throws InterruptedException;
    try {System.out.println(new Date().getSeconds());Thread.sleep(5000);System.out.println(new Date().getSeconds());} catch (InterruptedException e) {e.printStackTrace();}

setDaemon守护线程

非守护线程停止,那么守护线程自动退出

    public static void main(String[] args) {Thread thread1 = new Thread() {@Overridepublic void run() {super.run();for(int i = 0; i < 5; i ++) {System.out.println("非守护线程");}}};Thread thread2 = new Thread() {@Overridepublic void run() {for(int i = 0; i < 200; i ++) {System.out.println("守护线程");}}};thread2.setDaemon(true);thread1.start();thread2.start();}

可以很明显的看到thread2本应该执行200次输出,但是这里只输出了几行。因为当thread1执行完毕后,thread2作为守护线程就自动停止了。
1445322-20180924200402581-294795725.png

多线程join

如果执行了join方法,那么停止当前线程,先跑执行了join()的线程。相当于插队执行。如下,在执行thread2线程的时候,如果i==20的时候,则让thread1插队先执行

    public static void main(String[] args) {final Thread thread1 = new Thread() {@Overridepublic void run() {super.run();for(int i = 0; i < 500; i ++) {System.out.println("thread1---" + i);}}};Thread thread2 = new Thread() {@Overridepublic void run() {for(int i = 0; i < 200; i ++) {if (i == 20) {try {//插队执行thread1.join();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(i);}}};thread1.start();thread2.start();}

join()方法也可以传参数long 毫秒 join(毫秒)
表示让执行join的线程,插队执行XXX毫秒,过了时间后,两个线程交替执行

   public static void main(String[] args) {final Thread thread1 = new Thread() {@Overridepublic void run() {super.run();for(int i = 0; i < 500; i ++) {System.out.println("thread1---" + i);}}};Thread thread2 = new Thread() {@Overridepublic void run() {for(int i = 0; i < 200; i ++) {if (i == 20) {try {//插队执行1毫秒thread1.join(1);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(i);}}};thread1.start();thread2.start();}

yeild 礼让线程

yeild会让出cpu,让其他线程执行

    public static void main(String[] args) {final Thread thread1 = new Thread() {@Overridepublic void run() {super.run();for(int i = 0; i < 500; i ++) {System.out.println( getName() + "---" + i);}}};Thread thread2 = new Thread() {@Overridepublic void run() {for(int i = 0; i < 200; i ++) {if (i % 5 == 0) {Thread.yield();}System.out.println(getName() + "---" + i);}}};thread1.start();thread2.start();}

setPriority给线程设置优先级

默认优先级是5 最小1,最大10
越大优先级越高

public static void main(String[] args) {final Thread thread1 = new Thread() {@Overridepublic void run() {super.run();for(int i = 0; i < 500; i ++) {System.out.println( getName() + "---" + i);}}};Thread thread2 = new Thread() {@Overridepublic void run() {for(int i = 0; i < 500; i ++) {System.out.println(getName() + "---" + i);}}};//设置最大的线程优先级最大为10thread1.setPriority(Thread.MIN_PRIORITY);//设置最小的线程优先级,最小为1thread2.setPriority(Thread.MAX_PRIORITY);thread1.start();thread2.start();}

synchronized

同步代码块

当多线程并发,多段代码同时执行的时候。希望在执行其中代码的时候,cpu不切换线程

不用synchronized的情况

我们来看一下不用synchronized的情况会发生什么

public class ThreadSynchronied {public static void main(String[] args) {final Say say = new Say();Thread thread1 = new Thread() {@Overridepublic void run() {for (int i = 0 ; i < 10000 ; i ++) {say.say();}}};Thread thread2 = new Thread() {@Overridepublic void run() {for (int i = 0 ; i < 10000 ; i ++) {say.say1();}}};//设置最大的线程优先级最大为10thread1.setPriority(Thread.MIN_PRIORITY);//设置最小的线程优先级,最小为1thread2.setPriority(Thread.MAX_PRIORITY);thread1.start();thread2.start();}
}class Say {void say() {System.out.print("s ");System.out.print("a ");System.out.print("y ");System.out.print("h ");System.out.print("e ");System.out.print("l ");System.out.print("l ");System.out.println("o");}void say1() {System.out.print("1 ");System.out.print("2 ");System.out.print("3 ");System.out.print("4 ");System.out.print("5 ");System.out.print("6 ");System.out.print("7 ");System.out.println("8");}
}

1445322-20180924201221861-184513208.png

我们发现有些输出并没有打印全,在执行线程thread1的过程中,cpu被thread2抢占。这种情况下,肯定是不符合我们的业务逻辑的。所以我们要保证线程执行了一个完整的方法后,cpu才会被其他线程抢占

使用synchronized

public class ThreadSynchronied {public static void main(String[] args) {final Say say = new Say();Thread thread1 = new Thread() {@Overridepublic void run() {for (int i = 0 ; i < 10000 ; i ++) {say.say();}}};Thread thread2 = new Thread() {@Overridepublic void run() {for (int i = 0 ; i < 10000 ; i ++) {say.say1();}}};//设置最大的线程优先级最大为10thread1.setPriority(Thread.MIN_PRIORITY);//设置最小的线程优先级,最小为1thread2.setPriority(Thread.MAX_PRIORITY);thread1.start();thread2.start();}
}class Say {String s = "hahaah";void say() {synchronized (s) {System.out.print("s ");System.out.print("a ");System.out.print("y ");System.out.print("h ");System.out.print("e ");System.out.print("l ");System.out.print("l ");System.out.println("o");}}void say1() {synchronized (s) {System.out.print("1 ");System.out.print("2 ");System.out.print("3 ");System.out.print("4 ");System.out.print("5 ");System.out.print("6 ");System.out.print("7 ");System.out.println("8");}}
}

1445322-20180924201313867-1916616418.png

使用synchronized同步代码块后,就发现不会出现上述情况了

同步方法

public class ThreadSynchroniedMethod {public static void main(String[] args) {final Say say = new Say();Thread thread1 = new Thread() {@Overridepublic void run() {for (int i = 0 ; i < 10000 ; i ++) {say.say();}}};Thread thread2 = new Thread() {@Overridepublic void run() {for (int i = 0 ; i < 10000 ; i ++) {say.say1();}}};//设置最大的线程优先级最大为10thread1.setPriority(Thread.MIN_PRIORITY);//设置最小的线程优先级,最小为1thread2.setPriority(Thread.MAX_PRIORITY);thread1.start();thread2.start();}
}class Say {//在方法上加锁static synchronized void say() {System.out.print("s ");System.out.print("a ");System.out.print("y ");System.out.print("h ");System.out.print("e ");System.out.print("l ");System.out.print("l ");System.out.println("o");}static void say1() {synchronized (Say.class) {System.out.print("1 ");System.out.print("2 ");System.out.print("3 ");System.out.print("4 ");System.out.print("5 ");System.out.print("6 ");System.out.print("7 ");System.out.println("8");}}
}

同步方法指的就是在方法上加锁

静态同步方法的所对象是该类的字节码对象
非静态的同步方法锁对象是this

多个线程使用同一资源锁,容易造成死锁

什么是死锁?

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

线程安全类

Vector
StringBuffer
HashTable

线程不安全

ArrayList
StringBuilder
HashSet

java.util.Collections中有synchronizedList等方法,支持我们把线程不安全的集合转成线程安全的
1445322-20180924201344939-511625922.png

学习笔记

多次启动一个线程是非法的

转载于:https://www.cnblogs.com/amberbar/p/9696440.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cordova 一个将web应用程序封装成app的框架

cordova 一个将web应用程序封装成app的框架 cordova的详细介绍请参考这个链接&#xff1a;http://www.zhoujingen.cn/blog/7034.html 我接下来主要将如何搭建。 1.首先你需要下载几样东西 1.jdk. 2.android_SDK. 2.安装这两个&#xff0c;并配置环境变量 这里jdk的环境变量配置…

windows linux 子系统折腾记

最近买了部新电脑&#xff0c;海尔n4105的一体机&#xff0c;好像叫s7。 放在房间里面&#xff0c;看看资料。因为性能孱弱&#xff0c;所以不敢安装太强大的软件&#xff0c;然后又有一颗折腾的心。所以尝试了win10自带的linux子系统。然后在应用商店搜索linux推荐debian 系统…

《深入理解Java虚拟机》读书笔记八

第九章 类加载及执行子系统的案例与实战 Q&#xff1a;如果有10个WEB应用程序都是用Spring来进行组织管理的话&#xff0c;可以把Spring放到Common或Shared目录下&#xff08;Tomcat5.0&#xff09;让这些程序共享。Spring要对用户程序的类进行管理&#xff0c;自然要能访问到用…

js的原型和原型链

构造函数创建对象&#xff1a; function Person() {} var person new Person(); person.name Kevin; console.log(person.name) // KevinPerson 就是一个构造函数&#xff0c;我们使用 new 创建了一个实例对象 person prototype 每个函数都有一个 prototype 属性 每一个Ja…

二维数组

要求&#xff1a;求一个二维数组的最大子数组和 思路&#xff1a;对于这个题&#xff0c;我会最简单的读取&#xff0c;虽然在网上查到了代码&#xff0c;但是查找最大子数组的循环我真的看不懂&#xff0c;也不是特别懂思路&#xff0c;所以在这不会写思路 package 二维数组; …

033 Url中特殊字符的处理

在url跳转页面的时候&#xff0c;参数值中的#不见了&#xff0c;一直没有处理&#xff0c;今天有空看了一下&#xff0c;后来发现后台的过滤器之类的都没有处理&#xff0c;就比较奇怪了&#xff0c;原来是特殊字符的问题。 一&#xff1a;Url中的特殊字符 1.说明 这里还是需要…

Effective Java(1)-创建和销毁对象

Effective Java&#xff08;1&#xff09;-创建和销毁对象 转载于:https://www.cnblogs.com/Johar/p/10556218.html

VMware VIC

vSphere Integrated Containers - a short intro High-Level view of VCH Networking vSphere Integrated Containers Roles and Personas 参考链接&#xff1a;https://vmware.github.io/vic-product/assets/files/html/1.4/转载于:https://www.cnblogs.com/vincenshen/p/9715…

Locust学习总结分享

简介&#xff1a; Locust是一个用于可扩展的&#xff0c;分布式的&#xff0c;性能测试的&#xff0c;开源的&#xff0c;用Python编写框架/工具&#xff0c;它非常容易使用&#xff0c;也非常好学。它的主要思想就是模拟一群用户将访问你的网站。每个用户的行为由你编写的py…

初始Zookeeper

Zookeeper是一个分布式服务框架&#xff0c;据说是一个比较强大的架构模式&#xff0c;具体我也不甚了解&#xff0c;但是最近由于工作上的原因&#xff0c;需要部署一个Zookeeper服务&#xff0c;实现移动端一个简单的发单、抢单功能。于是我便开始了解这个框架&#xff0c;将…

Solr的安装和使用

安装 CentOS中先安装好Java和Tomcat。准备工具IK Analyzer 2012FF 和Solr-4.10.3.tgz 将solr-4.10.3文件夹中dist中的solr-4.10.3.war文件复制到Tomcat的webapps&#xff0c;并且更名为solr.war&#xff0c;下开启tomcat解压后再关闭tomcat&#xff0c;再删除solr.war。 将Solr…

maven如何修改本地仓库与中央仓库

什么是Maven仓库 在不用Maven的时候&#xff0c;比如说以前我们用Ant构建项目&#xff0c;在项目目录下&#xff0c;往往会看到一个名为/lib的子目录&#xff0c;那里存放着各类第三方依赖jar文件&#xff0c;如 log4j.jar&#xff0c;junit.jar等等。每建立一个项目&#xff0…

Maven项目 之eclipse操作篇

使用eclipse创建maven项目大家应该都很熟悉&#xff0c;这里主要说明如何将已创建的非maven项目修改为maven项目。 1.创建测试项目 创建一个Dynamic Web Project &#xff0c;项目结构如图。 2.配置工程类型 右击项目--> Properties --> Project Facets&#xff0c;勾选…

网络工程:3.1 RIP(Routing Information Protocol)协议

遵循协议&#xff1a; 1、特网rip1标准文件&#xff1a;rfc1058 网站 &#xff1a; https://tools.ietf.org/html/rfc1058 2、因特网rip2标准文件&#xff1a;rfc1723 网站 &#xff1a;https://tools.ietf.org/html/rfc1723 使用工具&#xff1a; GNS3 使用路由器文件&a…

2:word定制工作界面

1.2&#xff0c;定制工作界面 一、功能区的折叠和展开 设计选项----右上方的向上的箭头 功能区的选项&#xff1a;三个&#xff1a;自动隐藏功能区&#xff0c;显示选项卡&#xff0c;显示选项卡和命令 二、定制快速访问工具栏 如何将一些常用的命令放到一个能便捷找到的地方 第…

二维码生成

从vs Nugets搜索ThoughtWorks.QRCode下载ThoughtWorks.QRCode.dll private byte[] CreateQrcode(string code){ string enCodeString code;QRCodeEncoder qrCodeEncoder new QRCodeEncoder();qrCodeEncoder.QRCodeEncodeMode QRCodeEncoder.ENCODE_MODE.BYTE;qrCodeEncod…

Mac系统中MongoChef链接MongoDB集群的方法

第一步&#xff1a;启动Mongochef&#xff0c;点击链接按钮&#xff1b;第二步&#xff1a;打开连接配置面板&#xff0c;填写数据库名&#xff1b;第三步&#xff1a;选择链接类型Connection Type&#xff0c;一般分为直接连接和集群链接&#xff0c;这里选择集群链接 Replica…

crm 一级菜单排序,二级菜单选中并且展开,非菜单权限的归属,权限粒度控制到按钮级别...

排序 /rbac/templatetags/rbac.py from django import template from django.conf import settings import re from collections import OrderedDict register template.Library()register.inclusion_tag(rbac/menu.html) def menu(request):ordered_dictOrderedDict()menu_d…

Maven工程的多模块

一个大项目需要一个团队来完成,然后一个大型项目就拆分成几块来同时开发,节省时间,提高效率. 大致分为以下几个模块(仅是自身经历): 依赖管理工程模块:一般现在开发都是以maven来管理jar包,方便.所以整个工程的依赖统一放在一个单独工程中,一般叫做父工程xxx-parent. 注意事项…

查询语句

1.基本查询语句 1.1 语法&#xff1a; SELECT 属性列表 FROM 表名或视图列表 WHERE 条件表达式1 GROUP BY 属性名1 | HAVING 条件表达式2 ORDER BY 属性名2 ASC DESC 2.单表查询 1.应用&#xff1a;查询表中所有的记录 2.查询指定字段&#xff1a;查询表中所有name字段的记录 …