Day24_多线程第一天
1、线程
1、概述
package cn.itcast.createThread;
class MyThread extends Thread{
@Override
public void run() {
System.out.println("线程在运行");
}
}
public class Demo1 {
public static void main(String[] args) {
MyThread mt = new MyThread();
//启动线程
mt.start();
}
}
package cn.itcast.createThread;
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("启动了");
}
}
public class Demo {
public static void main(String[] args) {
//第一步:创建实现了Runnable接口的子类对象
MyRunnable mr = new MyRunnable();
//第二步:通过刚创建的mr对象创建Thread对象
Thread thread = new Thread(mr);
//第三步:启动线程
thread.start();
}
}
public class MyThread extends Thread{
@Override
public void run() {
//设置线程名
Thread.currentThread().setName("线程A");
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
MyThread mt = new MyThread();
mt.start();
}
}
package cn.itcast.create;
public class MyRunnable implements Runnable{
@Override
public void run() {
//设置线程名
Thread.currentThread().setName("线程A");
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable());
t.start();
}
}
2、卖票案例(掌握)
1、有问题的代码(出现错误票)
/**
卖票程序
*/
public class TicketRunnable implements Runnable{
private int tickets = 100;
@Override
public void run() {
while(true){
if(tickets > 0){
try {
Thread.sleep(1000);//必须加这个,由于CPU太快否则不一定出现负数-----语句1
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets--+"张的票");---语句2
}else{
break;//必须加这个,否则无法跳出循环,造成死机
}
}
}
}
/**
测试类
*/
public class TicketDemo {
public static void main(String[] args) {
TicketRunnable runnable = new TicketRunnable();
Thread t1 = new Thread(runnable, "窗口1");
Thread t2 = new Thread(runnable, "窗口2");
Thread t3 = new Thread(runnable, "窗口3");
t1.start();
t2.start();
t3.start();
}
}
修改后的代码/卖票案例完整代码
public class TicketRunnable implements Runnable {
private int tickets = 50;
private Object lock = new Object();
@Override
public void run() {
while (true) {
synchronized (lock) {
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+ "正在卖第" + tickets-- + "张的票");
} else {
break;
}
}
}
}
}
3、锁,同步代码块,同步方法(这块记住结论就好,根据自身情况自行测试)
4、死锁(掌握)
/**锁对象*/
public class Lock {
public static final Object LOCK_A = new Object();
public static final Object LOCK_B = new Object();
}
/**线程1*/
public class Thread1 extends Thread {
@Override
public void run() {
synchronized (Lock.LOCK_A) {
System.out.println("我是线程1,已经拿到A锁,将要去哪B锁");
synchronized (Lock.LOCK_B) {
System.out.println("我是线程1,成功拿到B锁");
}
}
}
}
/**线程2*/
public class Thread2 extends Thread {
@Override
public void run() {
synchronized (Lock.LOCK_B) {
System.out.println("我是线程2,已经拿到B锁,将要去哪A锁");
synchronized (Lock.LOCK_A) {
System.out.println("我是线程2,成功拿到A锁");
}
}
}
}
/**测试代码*/
public class Test {
public static void main(String[] args) {
Thread1 t1= new Thread1();
Thread2 t2= new Thread2();
t1.start();
t2.start();
}
}
- //注意:以上代码可能不会死锁,如果必须产生死锁效果将run()方法中的所有内容用while(true)包裹起来
5、休眠线程(掌握)
package cn.itcast.createThread;
public class MyThread extends Thread{
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
6、守护线程
package cn.itcast.createThread;
public class MyThread extends Thread{
@Override
public void run() {
while(true){
System.out.println("xx");
}
}
public static void main(String[] args) throws Exception {
MyThread mt = new MyThread();
mt.setDaemon(true);
mt.start();
//主线程在1S后结束,结束后mt线程也随之停止
Thread.sleep(1000);
}
}
7、加入线程
package cn.itcast.createThread;
public class MyThread extends Thread{
@Override
public void run() {
while(true){
System.out.println("xx");
}
}
public static void main(String[] args) throws Exception {
MyThread mt = new MyThread();
mt.start();
mt.join();
//因为mt线程被设置为加入线程,所以只有当mt线程执行完后你好才会执行
System.out.println("你好");
}
}
8、设置线程优先级
线程默认优先级是5。范围是1-10
13、今天必须掌握的内容,面试题,笔试题。(掌握这个就可以放心学习后面的知识了)
Day24_多线程第一天的更多相关文章
- “全栈2019”Java多线程第一章:认识多线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 秒杀多线程第一篇 多线程笔试面试题汇总 ZZ 【多线程】
http://blog.csdn.net/morewindows/article/details/7392749 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些 ...
- 5天不再惧怕多线程——第一天 尝试Thread
随笔 - 218 文章 - 1 评论 - 3819 5天不再惧怕多线程——第一天 尝试Thread 原本准备在mongodb之后写一个lucene.net系列,不过这几天用到多线程时才发现自己 ...
- Java学习多线程第一天
内容介绍 Thread 线程创建 线程池 线程状态图 1 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序 ...
- Abap 多线程
http://scn.sap.com/thread/18844 SAP ABAP 实现多线程 第一步:初始化server group ,server group 可以用RZ12进行维护,参数支 ...
- 跟着刚哥梳理java知识点——多线程(十六)
创建多线程第一种方式:① 继承:继承Thread.② 重写:重写Thread类的run()方法③ 创建:创建一个子类的对象④ 调用:调用线程的start()方法,启动此线程,调用run()方法 cla ...
- Java 多线程(一)—— 概念的引入
并发和并行 并行:指两个或多个时间在同一时刻发生(同时发生): 并发:指两个或多个事件在一个时间段内发生. 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单 C ...
- 多线程之 Thread类
一.多线程第一种方式的实现步骤(继承Thread类) 代码演示: 1.定义MyThread类,继承Thread类 2.重写了里面的run方法,在run方法中定义线程要执行的任务 public clas ...
- 收藏:c语言的多线程同步
1.<秒杀多线程第一篇 多线程笔试面试题汇总> 2.<秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别> 3.<秒杀 ...
随机推荐
- .NET截取指定长度汉字超出部分以"..."代替
/// <summary> /// 将指定字符串按指定长度进行剪切, /// </summary> /// <param name= "oldStr " ...
- BZOJ 1189 二分匹配 || 最大流
1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1155 Solved: 420[Submi ...
- C#中Thread与ThreadPool的比较
最近同事在编写一个基于UPD RTP协议的通信软件,在处理接收Listen时,发现了一个问题到底是用Thread还是ThreadPool呢? 我看同事的问题比较有典型性,还是做以整理培训一下吧 Thr ...
- C#自定义属性(跟成员变量的区别)
属性声明 public int age { get; set; } 从功能上等价于 private int m_age; public int age {get { return m_age; }se ...
- PowerMockito 同时mock多个对象
有时候,需要测试的方法内有collections结构,就需要同时mock多个对象 被测方法: public class EmployeeService { public List<Integer ...
- cisco vpn client 自动登陆脚本
cisco vpn client 不能保存密码,每次都要输入太麻烦了 写了个wsh,可以自动输入密码,并登陆 '需要一个好听的名字 <job id="cisco"> ' ...
- EF实体框架数据操作基类(转)
//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司 ...
- [DPDK][转]DPDK编程开发(4)—lcore
1.知识百科 返回值 操作函数 函数功能 RTE_DECLARE_PER_LCORE (unsigned, _lcore_id) RTE_DECLARE_PER_LCORE (rte_cpuset_t ...
- GoLang 通过http Post获取数据
func GetPostResponse(url, bodyType string, body *[]byte) (rdata []byte, err error) { b := bytes.NewB ...
- Android:Layout_weight的深刻理解
最近写Demo,突然发现了Layout_weight这个属性,发现网上有很多关于这个属性的有意思的讨论,可是找了好多资料都没有找到一个能够说的清楚的,于是自己结合网上资料研究了一下,终于迎刃而解,写出 ...