Java 学习(28)---(线程的控制 / 生命周期 /解决安全问题)
线程的控制
休眠线程
public class ThreadSleep extends Thread { @Override publicvoid run() { for ( int x = 0; x < 100; x++) { System. out .println(getName() + ":" + x + ", 日 期 : " + newDate()); // 睡眠 // 困了,我稍微休息 1 秒钟try { Thread. sleep (1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
加入线程
publicclass ThreadJoin extends Thread { @Override publicvoid run() { for ( int x = 0; x < 100; x++) { System. out .println(getName() + ":" + x); } } } ThreadJoin tj1 = new ThreadJoin(); ThreadJoin tj2 = new ThreadJoin(); ThreadJoin tj3 = new ThreadJoin(); tj1.setName(" 李渊 " ); tj2.setName(" 李世民 " ); tj3.setName(" 李元霸 " ); tj1.start(); try { // 李渊执行完,再执行其他两个 tj1.join(); } catch (InterruptedException e) { e.printStackTrace(); } tj2.start(); tj3.start();
礼让线程
publicclass ThreadYield extends Thread { @Override publicvoid run() { for (int x = 0; x < 100; x++) { System. out .println(getName() + ":" + x); // 让其他线程先走 Thread. yield (); } } }
后台线程
ThreadDaemon td1 = new ThreadDaemon(); ThreadDaemon td2 = new ThreadDaemon(); td1.setName(" 关羽 " ); td2.setName(" 张飞 " ); // 设置守护线程,主线程结束后,守护线程也会结束 td1.setDaemon(true); td2.setDaemon(true); td1.start(); td2.start(); // 设 置 主 线 程 名 为 “ 刘 备 ” Thread.currentThread().setName(" 刘备 " ); for ( int x = 0; x < 5; x++) { System.out.println(Thread.currentThread().getName() + ":" + x); }
终止线程
public class ThreadStop extends Thread { @Override public void run() { System. out.println(" 开始执行: " +new Date()); // 我要休息 10 秒钟,亲,不要打扰我哦 try { Thread.sleep(10000); }catch(Interrupted Exception e) { // e.printStackTrace(); System.out.println( " 线程被终止了" ); } System. out .println(" 结束执行: " +new Date()); } } ThreadStop ts =new ThreadStop(); ts.start(); // 你超过三秒不醒过来,我就干死你 try { Thread.sleep(3000); // ts.stop(); ts.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); }
线程的生命周期
多线程安全问题
判断一个程序是否有线程安全问题的依据 )
A:是否有多线程环境
B:是否有共享数据
C:是否有多条语句操作共享数据
同步解决线程安全问题
同步代码块
synchronized( 对象 ) { 需要被同步的代码 ; } 这里的锁对象可以是任意对象。 synchronized(d) { if(tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " 正在出售第 " + (tickets--) + " 张 票 " ); } }
同步方法
把同步加在方法上。这里的锁对象是 this privatesynchronizedvoid sellTicket() { if(tickets > 0) { try { Thread.sleep(100); } catch(InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() +" 正在出售第 " + (tickets--) + " 张 票 " ); } }
静态同步方法
把同步加在方法上。 这里的锁对象是当前类的字节码文件对象(反射再讲字节码文件对象) private static synchronized void sellTicket() { if (tickets > 0) { try { Thread.sleep(100); } catch(InterruptedException e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " 正在出售第 " + (tickets--) +" 张票 " ); } }
同步锁对象
// 定义票 private int tickets = 100; // 定义锁对象 private Lock lock =new ReentrantLock(); @Override public void run() { while (true) { try{ // 加锁 lock.lock(); if (tickets > 0) { try { Thread.sleep(100); } catch(InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " 正在出售第 " + (tickets--) +" 张票 " ); } }finally{ // 释放锁 lock.unlock(); } } }
同步的好处
同步的出现解决了多线程的安全问题。
同步的弊端
当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的, 无形中会降低程序的运行效率。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一文带你入门图论和网络分析
简介 俗话说一图胜千言。但是“图”(Graph)说的远不止于此。以图形式呈现的数据可视化能帮助我们获得见解,并基于它们做出更好的数据驱动型决策。 但要真正理解图是什么以及为什么使用它们,我们需要理解一个称为图论(Graph Theory)的概念。理解它可以使我们成为更好的程序员。 如果你曾经尝试理解这个概念,应该会遇到大量的公式和干涩的理论。这便是为什么我们要写这篇博文的原因。我们先解释概念,然后提供实例,以便你可以跟随并弄明白它的执行方式。这是一篇详细的文章,因为我们认为提供概念的正确解释要比简洁的定义更受欢迎。 在本文中,我们将了解图是什么,它们的应用以及一些历史背景。我们还将介绍一些图论概念,然后使用进行案例研究以巩固理解。 准备好了吗?我们开始吧。 目录 图及其应用图论的历史、为何使用图论必备术语图论概念熟悉Python中的图数据分析案
- 下一篇
Java 详解 JVM 工作原理和流程
Java 详解 JVM 工作原理和流程作为一名Java使用者,掌握JVM的体系结构也是必须的。说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。它们的关系如下图所示: 运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。 Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上。这个平台的结构如下图所示: 在Java平台的结构中, 可以看出,Java虚拟机(JVM) 处在核心的位置,是程序与底层操作系统和硬件无关的关键。它的下方是移植接口,移植接口由两部分组成:适配器和Java操作系统, 其中依赖于平台的部分称为适配器;JVM 通过移植接口在具体的平台和操作系统上实现;在JVM 的上...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能