java多线程知识回顾(笔记)
线程创建的方式 有两种
第一种是继承Thread类 重写run方法 (个人偏向这一种实际中这种用的较多)
例如
- public class MyThead extends Thread {
- int j=20;
- public void run(){
- for (int i = 0; i < 20; i++) {
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println(this.getName()+",i="+j--);
- }
- }
- }
这种自己测试时也很多人写
- new Thread(new Runnable() {
@Override
public void run() {- }
}).start(); 这样不好控制线程但是平时写一下也没关系- 第二种第二种是实现Runnable接口
- public class Thread3 implements Runnable{
- @Override
- public void run() {
- for (int i = 0; i < 20; i++) {
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println("接口Runnable"+",i="+i--);
- }
- }
- }
主线程调用方式
- public static void main(String[] args) throws InterruptedException {
- MyThead myThead= new MyThead();
- MyThread1 myThead1= new MyThread1();
- Thread3 thread3=new Thread3();
- //thread3.run();//这样不是开线程运行
- Thread t = new Thread(thread3);
- t.start();
- myThead.start();
- myThead1.start();
- }
个人还是倾向继承Thead 赶脚方便
-------------------------------------------------------------------------------------------------------------------
线程实现后最多的也就是用到线程同步了(synchronized 关键字 其他锁以后说)
来自
- https://www.cnblogs.com/blueSkyline/p/8598099.html
自己大一学的时候感觉懵逼的不行 ...三年后清晰不少
- public class SynMethod {
- private static final Object staticLockObj = new Object();
- /**
- * 对象锁,代码级别,同一对象争用该锁,this为SynMethod实例,synchronized的锁绑定在this对象上
- */
- public void method1() {
- synchronized (this) {
- for (int i = 0; i < 100; i++) {
- System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
- }
- }
- }
- /**
- * 对象锁,方法级别,同一对象争用该锁,普通(非静态)方法,synchronized的锁绑定在调用该方法的对象上,与上一个写法含义一致()
- */
- public synchronized void method2() {
- for (int i = 0; i < 500; i++) {
- System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
- }
- }
- /**
- * 对象锁,代码级别,同一类争用该锁,绑定在staticLockObj上,不同SynMethod实例,拥有同一个staticLockObj对象
- */
- public void method3() {
- synchronized (staticLockObj) {
- for (int i = 0; i < 50; i++) {
- System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
- }
- }
- }
- /**
- * 类锁,代码级别,同一类争用该锁
- */
- public void method4() {
- synchronized (SynMethod.class) {
- for (int i = 0; i < 50; i++) {
- System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
- }
- }
- }
- /**
- * 类锁,方法级别,同一类争用该锁,synchronized的锁绑定在SynMethod.class上
- */
- public static synchronized void staticMethod() {
- for (int i = 0; i < 5; i++) {
- System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
- }
- }
- }
解释的比较清楚 自己试一试才是关键 ........
为什么能加上去锁呢?对象头部都有一些标志位...详情百度
------------------------------------------------------------------------------------------
大一的时候看过一个多线程简单的例子 火车站卖票的例子 一个线程相当于一个窗口 开多个窗口同时买票 且不重复
但是看完之后有点懵逼 模棱两可也就过去了 现在明白不少 主要是上面的synchronized关键字 当然也可以用其他锁实现 先贴一下自己的例子
- public class Station extends Thread {
- public Station(String name) {
- super(name);// 给线程名字赋值
- }
- static int tick=50;
- @Override
- public void run() {
- while (tick>0)
- {
- synchronized (Station.class) //同步这里不能写this 可以是类 this 只会在本对象生效 new 一个新的没办法共同使用
- {
- if (tick>0)
- {
- System.out.println(getName()+"卖了第"+tick+"张票");
- tick--;
- }else
- {
- System.out.println("票已经卖完");
- }
- }
- try {
- sleep(100);//这里让线程不得到CUP 一下否则可能一个线程把事情干完了 达不到模拟效果
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
synchronized (Station.class) 可以使用注意不要用this 那样窗口买票可能会重复的...也可以 在station 类里面new 一个没用的object对象 用哪个对象当钥匙(因为你new 再多的对象还是用那一个object 看看synchronized 的前面的例子运行一下就明白很多) 这两种解决都可以
也可以station 类继承Runnable 接口 实现run方法 加锁的时候直接this 主方法new 一个对象 开启两个线程 也不会出问题
买票main函数
- Station station1=new Station("窗口1");
- Station station2=new Station("窗口2");
- Station station3=new Station("窗口3");
- station1.start();
- station2.start();
- station3.start();
第二种写法 道理一样的 加锁那里写 this
- public class Station1 implements Runnable{
- static int tick=1000;
- @Override
- public void run() {
- while (tick>0)
- {
- synchronized (this)
- {
- System.out.println(Thread.currentThread().getName()+"卖出了第"+tick+"张飘");
- tick--;
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- System.out.println("票已经卖完");
- }
- }
main
- Station1 station11=new Station1();
- Thread t1=new Thread(station11,"第一个");
- Thread t2=new Thread(station11,"第二个");
- t1.start();
- t2.start();
java多线程知识回顾(笔记)的更多相关文章
- Java多线程技术学习笔记(二)
目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- java基础知识回顾之---java String final类普通方法
辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /* * 按照面向对象的思想对字符串进行功能分类. * ...
- JAVA多线程知识总结(二)
本文是承接上一篇文章:JAVA多线程知识总结(一) 四.Java多线程的阻塞状态与线程控制 上文已经提到线程阻塞的集中具体类型.下面主要看引起JAVA线程阻塞的方法 1,join()-----让一个 ...
- java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)
*java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时 ...
- Java基础知识回顾(一):字符串小结
Java的基础知识回顾之字符串 一.引言 很多人喜欢在前面加入赘述,事实上去技术网站找相关的内容的一般都应当已经对相应知识有一定了解,因此我不再过多赘述字符串到底是什么东西,在官网中已经写得很明确了, ...
- Java多线程编程(学习笔记)
一.说明 周末抽空重新学习了下多线程,为了方便以后查阅,写下学习笔记. 有效利用多线程的关键是理解程序是并发执行而不是串行执行的.例如:程序中有两个子系统需要并发执行,这时候需要利用多线程编程. 通过 ...
- Java多线程学习开发笔记
线程有有序性和可见性 多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现. 在多个线程之间共享类的一个对象,这个对象是被创建在主内存(堆内存)中,每个线程都有自己的工作内存(线 ...
- JAVA 多线程知识总结(一)
一,线程的生命周期以及五种基本状态 关于JAVA线程的生命周期,首先看一下下面这张图 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌握了. Ja ...
随机推荐
- Jquery 事件 文本框常用
1.只许输入类型 //只能输入整数和小数 function txtKeyUpDecimal(txtName) { getID(txtName).keyup(function(){ //keyup事件处 ...
- for in 与for 与hasOwnProperty
在遍历一个对象的时候我们会使用到for in属性. 现有对象和数组如下: var filght = { number: 1, status: 'watit', arrival: [1,2,3], ad ...
- layer 当前页获取iframe页的DOM元素
layer.layui 开启iframe 之后,获取iframe 内容做自定义处理. parent.layer.open({ type: , title: '任務執行狀況.', shadeClose ...
- Java中短路
当使用逻辑运算符时,我们会遇到一种“短路”的现象.即一旦能够准确无误的确定整个表达式的值,就不再计算表达式余下的部分了.因此整个表达式靠后的部分有可能不被运算 /**短路 * @param args ...
- 执行脚本,且以脚本名保存log
!/bin/bash path="/sys/devices/platform/soc/fd880000.i2c-pld/i2c-0/i2c-4/i2c-15/15-0060" f_ ...
- Apache Shiro安全(权限框架)学习笔记一
1. 授权需要继承 AuthorizingRealm 类, 并实现其 doGetAuthorizationInfo 方法 2. AuthorizingRealm 类继承自 Authenticating ...
- mapreduce程序执行过程
1.客户端程序,设置作业相关的配置和计算输入分片信息,向RM获取一个JOBID,提交作业信息(分片)到以作业ID为目录下,通知APP——MASTER 2.APP——MASTER,读取指定目录下的作业信 ...
- SwiftStack 因战略转变而裁员
导读 销售团队在前段圣诞节来临前面临裁减的糟糕处境.企业云存储公司SwiftStack进行了裁员,人数不详,公司规模因此缩小. IT外媒The Register获悉,这家公司裁掉了大概一半的人员,但总 ...
- MessageBox函数
<Windows程序设计>(第五版)(美Charles Petzold著) https://docs.microsoft.com/zh-cn/windows/desktop/apiinde ...
- iOS 批量上传图片的 3 种方法
AFNetworking 在去年年底升级到了 3.0.这个版本更新想必有很多好处,然而让我吃惊的是,它并没有 batch request 接口.之前的 1.x 版本.2.x 版本都实现了这个很常见的需 ...