Java基础学习篇---------多线程

一.编写两种多线程的方法
(1).Thread(它是继承Runnable的子类)
class MyThread extends Thread{
private int ticket = 5;
@Override
public void run() {
for (int i=0 ; i<20;i++){
if(this.ticket>0)
System.out.println("卖出的票数为" + this.ticket--);
}
}
}
public class MyClass {
// 测试静态内部类
public static void main(String[] args) {
new MyThread().start();
new MyThread().start();
new MyThread().start();
}
}
卖出的票数为5
卖出的票数为4
卖出的票数为3
卖出的票数为2
卖出的票数为1
卖出的票数为5
卖出的票数为4
卖出的票数为3
卖出的票数为2
卖出的票数为1
卖出的票数为5
卖出的票数为4
卖出的票数为3
卖出的票数为2
卖出的票数为1
(2).继承Runnable接口的实现
class MyThread implements Runnable{
private int ticket = 5;
@Override
public void run() {
for (int i=0 ; i<20;i++){
if(this.ticket>0)
System.out.println("卖出的票数为" + this.ticket--);
}
}
}
public class MyClass {
// 测试静态内部类
public static void main(String[] args) {
MyThread myThread = new MyThread();
new Thread(myThread).start();
new Thread(myThread).start();
new Thread(myThread).start();
//myThread.start();
//myThread1.start();
//myThread2.start();
}
}
卖出的票数为4
卖出的票数为5
卖出的票数为2
卖出的票数为3
卖出的票数为1
二、两种线程的区别
Thread的方法:会受到单继承的局限性,且不方便表示出数据共享的概念
Runnable的方法 : 不会受到单继承的局限性,可以方便表示出数据共享的概念
它们最终都会调用Thread().start的方法。
三、常见的线程的编写
new Thread(new Runnable() {
@Override
public void run() {
System.out.printf("这是hello world");
}
}).start(); 四、线程的同步和死锁
1.线程同步的方法 : 同步代码块、同步方法
(1).同步代码的关键字 : synchronized
class Mythread implements Runnable{
private int ticket = 8 ;
@Override
public void run() {
for(int i = 0; i<20; i++) {
synchronized (this) {
if (this.ticket > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("剩余的票数" + this.ticket--);
}
}
}
}
}
public class MyClass {
// 测试静态内部类
public static void main(String[] args) {
Mythread mythread = new Mythread();
new Thread(mythread,"A").start();
new Thread(mythread,"B").start();
new Thread(mythread,"C").start();
new Thread(mythread,"D").start();
new Thread(mythread,"E").start();
}
}
(2).代码的同步的方法:在方法上面加synchronized的关键字
class Mythread implements Runnable{
private int ticket = 8 ;
@Override
public void run() {
for(int i = 0; i<20; i++) {
this.sale();
}
}
public synchronized void sale(){
if (this.ticket > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("剩余的票数" + this.ticket--);
}
}
}
public class MyClass {
// 测试静态内部类
public static void main(String[] args) {
Mythread mythread = new Mythread();
new Thread(mythread,"A").start();
new Thread(mythread,"B").start();
new Thread(mythread,"C").start();
new Thread(mythread,"D").start();
new Thread(mythread,"E").start();
}
}
五、线程的优先级
Thread.setPriority(int num) : 设置线程的优先级
六、生产者和消费者
1.解决重复的操作必须使用等待和唤醒的功能
Object类中含有使用的关键函数
1.等待的使用: wait()
2.唤醒第一个: notify()
3.唤醒全部 : notifyAll() : 谁的优先级高先执行谁
2.生产者消费者的代码
class Message{
private String name;
private String context;
private Boolean flag = true;
public synchronized void setName(String name , String context) {
if (this.flag == false){
try {
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.name = name;
this.context = context;
this.flag = false;
super.notify();
}
public synchronized void getName() {
if(this.flag == true){
try {
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(this.name + ":"+ context);
this.flag = true;
super.notify();
}
}
class Product implements Runnable{
private Message message;
public Product(Message msg){
this.message = msg;
}
@Override
public void run() {
for (int i = 0;i<100;i++){
if(i % 2 == 0 ) {
message.setName("想成为","诗人");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
message.setName("不想成为","囚犯");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class Custor implements Runnable{
private Message message;
public Custor(Message msg){
this.message = msg;
}
@Override
public void run() {
for (int i = 0;i<100;i++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
message.getName();
}
}
}
public class MyClass {
// 测试静态内部类
public static void main(String[] args) {
Message message = new Message();
// Product product = new Product(message);
// Custor custor = new Custor(message);
// Thread thread1 = new Thread(product);
// Thread thread2 = new Thread(custor);
// thread1.start();
// thread2.start();
new Thread(new Product(message)).start();
new Thread(new Custor(message)).start();
}
}
七、sleep()和wait()的区别
1.sleep() : 它是Thread的内部定义的,可以自动唤醒
2.wait() : 它是Object的内部定义的,需要手工用notify或notifyAll唤醒
Java基础学习篇---------多线程的更多相关文章
- Java基础学习总结 -- 多线程的实现
目录: 继承Thread类 start()方法实现多线程的原理 实现Runnable接口 Thread类 与 Runnable接口 的联系与区别 多线程的实现方法: 继承Thread类 实现Runna ...
- Java基础学习篇---------继承
一.覆写(重写) 1.含义:子类的定义方法.属性和父类的定义方法.属性相同时候 方法名称相同,参数相同以及参数的个数也相同,此时为覆写(重写) 扩充知识点: 覆盖:只有属性名字和方法名字相同,类型.个 ...
- Java基础学习(八) - 多线程
理解线程 进程是指一个内存中运行的应用程序,系统运行一个程序即是一个进程从创建,运行,结束的过程. 线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程. 多线程的特点是并发 ...
- Java基础学习篇---------this、object的学习
一.this的学习方法 1.使用this调用构造方法市一定放在构造方法的首行 2.使用this调用构造方法时一定流出调用的出口 public class MyClass { public MyClas ...
- Java基础学习篇---------String、集合的学习
一.String常用的方法: 1. == 实质比较两个对象的地址数值 String a = "hello" (hello为匿名对象) String a1 = "hell ...
- Java基础学习篇---------封装
一.类和对象分配内存 二.Java中的内部类 : 可以直接去访问外部类的所有属性(包括私有成员) 1.Java中成员内部类 (1).内部类的方法可以直接访问外部类的类中的所有成员变量 (2).外部类 ...
- Java基础学习篇---------static
一.static的使用 1.使用static定义的属性往往通过类名直接调用,它的属性(方法)不属于某一个的对象的.所以对象没有创建之前就可以对static的属性的调用,方法亦如此. 2.static ...
- Java基础学习篇---------多态
一.多态性的理解 1.向上转型:子类为父类对象实例化,调用的一定是子类覆写的方法,他们之间找的是共性 2.向下转型:子类扩充了父类的某些功能,而父类中没有该功能,他们之间找的是特性 案例: Numbe ...
- Java基础学习-- 继承 的简单总结
代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...
随机推荐
- JFinal WEB MVC和Struts简要对比
JFinal遵循COC原则,零配置,无xml,而struts需要配置来支持action.result.interceptor配置与使用. JFinal开发效率非常之高,相对Struts开发效率能提升五 ...
- Judy Array - Example
“ In computer science and software engineering, a Judy array is a data structure that has high perfo ...
- Netty 零拷贝(一)NIO 对零拷贝的支持
Netty 零拷贝(二)NIO 对零拷贝的支持 Netty 系列目录 (https://www.cnblogs.com/binarylei/p/10117436.html) 非直接缓冲区(HeapBy ...
- 01 Linux 网络配置和克隆
Linux 网络配置和克隆 一.配置 Linux 网络 当在 VMware 中安装完 Linux 以后需要通过一些网络配置才能使 Linux 能够连能网络: 首先如果是在虚拟机上安装的 Linux 必 ...
- smrtlink
SMRT Link is the web-based end-to-end workflow manager for the Sequel™ System. It includes software ...
- 关于多系统跨浏览器 BrowserStack 的使用
偶然在Scott Hanselman Blogs看到一篇关于 BrowserStack 博文,对于前端多浏览器测试. 现在拥有各自内核的浏览器越来越多,各自的特性也千差万别.如果作为一个前端攻城师想要 ...
- 2018.10.20 NOIP模拟 巧克力(trie树+dfs序+树状数组)
传送门 好题啊. 考虑前面的32分,直接维护后缀trietrietrie树就行了. 如果#号不在字符串首? 只需要维护第一个#前面的字符串和最后一个#后面的字符串. 分开用两棵trie树并且维护第一棵 ...
- 2018.08.20 loj#116. 有源汇有上下界最大流(模板)
传送门 貌似就是转成无源汇,然后两遍最大流搞定? 其实第二遍跑最大流是自动加上了第一次的答案. 代码: #include<bits/stdc++.h> #define N 100005 # ...
- 2018.08.17 bzoj4653: [Noi2016]区间(线段树+尺取法)
传送门 将坐标离散化之后直接用尺取法(双指针)+线段树维护. 其实就是说只要目前所有点的被覆盖次数是大于等于m的就移动左指针删除区间更新答案,否则移动右指针加入区间更新答案. 话说忘记排序以及建树的时 ...
- 【Unity】2.1 初识Unity编辑器
分类:Unity.C#.VS2015 创建日期:2016-03-26 一.简介 本节要点:了解Unity编辑器的菜单和视图界面,以及最基本的操作,这是入门的最基础部分,必须掌握. 二.启动界面 双击桌 ...