个人理解:加同步锁等的时候,就可以让线程”按顺序排队“,一个一个地抢CPU,一个抢完对应的每次有的CPU了,另一个才抢对应的每次有的CPU,解决”并发“问题等。

自己写的礼让(个人的理解:礼让就是选择放弃独占CPU,

选择和其他线程分享抢到的CPU)例子题目:打印循环累加1的num,用上同步锁使之不乱序(个人的理解:同步锁的作用等就是让打印的线程启动等后的结果,不是乱序,而是有序,有逻辑和规律的)

/**

*

*/

package thread;

import java.util.Random;

public class jinKuang {

public static void main(String[] args) throws Exception{

personClass personClass=new personClass();

new Thread(personClass, "三连").start();

new Thread(personClass, "关注").start();

new Thread(personClass, "诗书画唱").start();

}

}

class personClass implements Runnable{

static int num=0;

@Override

public void run() {

while(true){

synchronized (this) {

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

num++;

System.out.println(Thread.currentThread()

.getName()+"抢到当前CPU,现在num的值为"+num);

//个人理解:礼让就是选择放弃独占CPU,

//选择和其他线程分享抢到的CPU

if(num%5==0){

Thread.yield();

//yield英[jiːld]

//美[jiːld]

//v.出产(作物); 产生(收益、效益等);

//提供; 屈服; 让步; 放弃; 缴出;

//n.产量; 产出; 利润;

System.out.println(Thread.currentThread()

.getName()+"进行了礼让");

}

if(num==100){

try {

Thread.sleep(10);

System.out.println("休息一下");

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if(num==200){

break;

}

}

}

}

}

设计一个线程,模拟买票场景,现有100张票,

使用3个线程进行购买车票

方法一:

package thread;

import java.util.Random;

public class cheZhan {

public static void main(String[] args) throws Exception{

chePiaoClass chePiaoClass=new chePiaoClass() ;

//下面是省了重命名的部分,直接new实例化:

new Thread(chePiaoClass, "长沙站").start();

new Thread(chePiaoClass, "北京站").start();

new Thread(chePiaoClass,"山东站").start();

}

}

class chePiaoClass implements Runnable{

static int piaoShu=100;//总票数

public void run() {

//票数大于0就可以卖票:

while(piaoShu>0){

//加synchronized的话,打印出来的才

//会有从大到小等的顺序等。

//不然的话,打印出的内容等就会很乱,

//这是安全性出了问题

synchronized (this) {

//synchronized关键字是用来控制线程同步的,

//就是在多线程的环境下,

//控制synchronized代码段不被多个线程同时执行。

//

//synchronized是Java中的关键字,是一种同步锁。

//synchronized:

//英[ˈsɪŋkrənaɪzd]

//美[ˈsɪŋkrənaɪzd]

//v.(使) 同步,在时间上一致,同速进行

try {

Thread.sleep(100);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

if(piaoShu>0){

System.out.println(Thread.currentThread()

.getName()+"卖出了第"+piaoShu+"张票");

}piaoShu--;}

}

}

}

方法二:

package thread;

import java.util.Random;

public class piao implements Runnable{

static int num;

static int count;

piao(){

num = 100;

count = 0;

}

@Override

public void run() {

while(num > 0){

synchronized (this) {

try{

Thread.sleep(new Random().nextInt(20));

}catch(Exception e){

e.printStackTrace();

}

if(num > 0){

System.out.println(Thread.currentThread().getName()

+"_____买的票数号码"+num);

num --;

count ++;}

}

}

}

public static void main(String[] args){

piao ticket = new piao();

for(int line = 1 ; line <= 3 ; line ++){

new Thread(ticket,"线程名:线程"+line).start();

}

}

}

创建一个兔子类,一个乌龟类,进行赛跑,目标为10米,

兔子每跑1米休息0.05秒,规定生成随机数,兔子生成的随机数范围为0-5,生成的随机数为3时才开始跑一米,乌龟生成的随机数范围0-20,生成的随机数为13的时候才开始跑一米,乌龟每跑一米休息0.01秒 ,使用线程模拟这个特定龟兔赛跑的过程:

/**

*

*/

package thread;

import java.util.Random;

public class tuZi {

//垃圾回收线程:

//执行垃圾回收的线程,称为垃圾回收线程。

public static void main(String[] args) throws Exception{

//2.创建一个兔子类,一个乌龟类,进行赛跑,目标为10米,

//兔子每跑1米休息0.05秒,兔子的随机范围为0-5,随机到3开始跑,

//  乌龟随机范围0-20,随机到13的时候开始跑,

//乌龟没跑一米休息0.01秒 ,使用线程模拟

wuGuiClass wuGuiClass=new wuGuiClass();

new Thread(wuGuiClass,"乌龟").start();

tuZiClass tuZiClass=new tuZiClass();

new Thread(tuZiClass,"兔子").start();

}

}

class wuGuiClass implements Runnable{

static int weiZhi=0;//:开始的位置为0米的位置

Random RandomNum=new Random();

public void run() {

while(true){//如果没有到终点一直跑

//乌龟每跑一米休息0.01秒

//设置他们跑的速度就用随机数去设置

int shuzi=RandomNum.nextInt(25);

System.out.println("乌龟生成的随机数为"+shuzi);

//乌龟随机到13之后才开始跑

if(shuzi==13){

weiZhi++;//每次生成的随机数为13时跑一米

System.out.println("乌龟共跑了"+weiZhi+"米");

}

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//乌龟或者兔子不管谁到终点,都用break停止所有线程

if(wuGuiClass.weiZhi>=10||tuZiClass.weiZhi>=10){

//怎么判断谁赢了

if(wuGuiClass.weiZhi>=10){

System.out.println("乌龟胜利");

}

if(tuZiClass.weiZhi>=10){

System.out.println("兔子胜利");

}

break;

}

}

}

}

class tuZiClass implements Runnable{

static int weiZhi=0;//开始的位置为0米的位置

Random RandomNum=new Random();

public void run() {

while(true){//如果没有到终点一直跑,

//兔子每跑一米休息0.05秒,用上sleep

int tuZiNum=RandomNum.nextInt(5);

System.out.println("兔子生成的随机数为了"+tuZiNum);

if(tuZiNum==3){

weiZhi++;//每次生成的随机数为3时跑一米

System.out.println("兔子共跑了"+weiZhi+"米");

}

try {

Thread.sleep(50);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

if(wuGuiClass.weiZhi>=10||tuZiClass.weiZhi>=10){

//用两个if判断谁赢了

if(wuGuiClass.weiZhi>=10){

System.out.println("乌龟胜利");

}

if(tuZiClass.weiZhi>=10){

System.out.println("兔子胜利");

}

break;

}

}

}

}

简述线程的生命周期

生命周期由4种状态组成:

1.就绪状态:实例化好了这个线程,但是并没有启动这个线程

2.可运行状态:启动了这个线程,但是这个线程并没有抢到cpu的使用权

3.运行状态:这个线程抢到了cpu的使用权

4.死亡状态:这个线程的代码全部执行完毕之后,就释放掉这个线程

//创建一个兔子类,一个乌龟类,进行赛跑,

//目标为100米,

//(1)兔子每 0.1 秒 5 米的速度,每跑20米休息0.1秒;

//(2)乌龟每 0.1 秒跑 2 米的速度,不休息,乌龟一直跑,使用线程模拟;

JS中回调函数(callback)理解:

字面上理解下来就是,回调就是一个函数的调用过程。那么就从理解这个调用过程开始吧。函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b。那么这个过程就叫回调。

其实中文也很好理解:回调,回调,就是回头调用的意思。函数a的事先干完,回头再调用函数b。

举个现实的例子:约会结束后你送你女朋友回家,离别时,你肯定会说:“到家了给我发条信息,我很担心你。”对不,然后你女朋友回家以后还真给你发了条信息。小伙子,你有戏了。

其实这就是一个回调的过程。你留了个函数b(要求女朋友给你发条信息)给你女朋友,然后你女朋友回家,回家的动作是函数a。她必须先回到家以后,函数a的内容执行完了,再执行函数b,然后你就收到一条信息了。

这里必须清楚一点:函数b是你以参数形式传给函数a的,那么函数b就叫回调函数。

也许有人有疑问了:一定要以参数形式传过去吗,我不可以直接在函数a里面调用函数b吗?确实可以。求解中。

解惑:如果你直接在函数a里调用的话,那么这个回调函数就被限制死了。但是使用函数做参数就有下面的好处:当你a(b)的时候函数b就成了回调函数,而你还可以a(c)这个时候,函数c就成了回调函数。如果你写成了function a(){...;b();}就失去了变量的灵活性。

含个人的超级详细的解析:

//创建一个兔子类,一个乌龟类,进行赛跑,

//目标为100米,

//(1)兔子每 0.1 秒 5 米的速度,每跑20米休息0.1秒;

//(2)乌龟每 0.1 秒跑 2 米的速度,不休息,乌龟一直跑,使用线程模拟;

package thread;

import java.util.Random;

import thread.Animal.Calltoback;

public class guiTuGame {

public static void main(String[] args) throws Exception{

// 实例化乌龟和兔子:

//tortoise英[ˈtɔːtəs]

//美[ˈtɔːrtəs]

//n.陆龟; 龟;

//————————————

//rabbit英[ˈræbɪt]

//美[ˈræbɪt]

//n.兔; 野兔; 兔肉;

//v.猎兔; 捕兔;

wuGuiDeClass wuGuiDeClass = new wuGuiDeClass();

rabbitClass rabbitClass = new rabbitClass();

// 回调方法的使用,谁先调用calltoback方法,另一个就不跑了

//        回调就是一个函数的调用过程。"call to back":"叫其回来"

//        那么就从理解这个调用过程开始吧。

//        函数a有一个参数,这个参数是个函数b,

//        当函数a执行完以后执行函数b。

//        那么这个过程就叫回调。

//        LetLoserStop:让败者停止线程的开启

//      当wuGuiDeClass wuGuiDeClass = new wuGuiDeClass();

//      部分的线程先结束(乌龟赢)时,

//        就会wuGuiDeClass传值

//        到回执函数,就会执行下面的一句的回执函数等,

//        calltoback != null,

//        就会执行乌龟类中的 calltoback.win();

//        让兔子类的也再次执行一次回执函数,让兔子停止

LetLoserStop letLoserStopWuGui =

new LetLoserStop(wuGuiDeClass);

// 让兔子的回调方法里面存在乌龟对象的值,可以把乌龟停止stop:

rabbitClass.calltoback =

letLoserStopWuGui;

LetLoserStop letLoserStopRabbit =

new LetLoserStop(rabbitClass);

// 让乌龟的回调方法里面存在兔子对象的值,可以把兔子停止stop:

wuGuiDeClass.calltoback = letLoserStopRabbit;

// 开始跑:

wuGuiDeClass.start();

rabbitClass.start();

}

}

//LetOneStop:让一个停止

//当有一个到达终点的时候,需要让没到终点的乌龟或兔子的线程停止

//,不然的话就会有这里"乌龟获得了胜利"和

//"兔子获得了胜利"都打印出来,所以要用回调函数

//Calltoback,当兔子和乌龟的线程执行时,有一方到达时候,就把

//这一方的参数传到回调函数,让回调函数中声明的stop方法起效果

class LetLoserStop implements Calltoback {

// 动物对象

Animal loserClass;

// 获取动物对象,可以传入兔子或乌龟的实例

public LetLoserStop(Animal loserClass) {

this.loserClass = loserClass;

}

// 让动物的线程停止:

public void win() {

// 线程停止用stop方法:

loserClass.stop();

}

}

class wuGuiDeClass extends Animal {

public wuGuiDeClass() {

setName("乌龟");// Thread的方法,给线程赋值名字

}

// 重写running方法,编写乌龟的奔跑操作

@Override

public void runing() {

// x:乌龟的位移:

int x = 2;

length -= x;

System.out.println("乌龟跑了" +

x + "米,距离终点还有" + length + "米");

if (length <= 0) {

length = 0;

System.out.println("乌龟获得了胜利");

// 让兔子不要在跑了

if (calltoback != null) {

calltoback.win();

}

}

try {

sleep(100);

//每0.1秒跑2米,用sleep实现速度的效果

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

class rabbitClass extends Animal {

public rabbitClass() {

setName("兔子");

}

@Override

public void runing() {

//X:兔子位移:

int x = 5;

length -= x;

System.out.println("兔子跑了" + x

+ "米,距离终点还有" + length + "米");

if (length <= 0) {

length = 0;

System.out.println("兔子获得了胜利");

// 给回调对象赋值,让乌龟不要再跑了

if (calltoback != null) {

calltoback.win();

}

}

try {

if ((2000 - length) % 20 == 0) {

// 每20米休息一次,休息时间是0.1秒

sleep(100);

} else {                //每0.1秒跑5米

sleep(100);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

//这里用动物类继承了线程类就

//可以有线程类等的特性等,在主函数传兔子类或乌龟类时,就不会报错等

abstract class Animal extends Thread {

public int length = 100;// 比赛长度

public abstract void runing();

@Override

public void run() {

super.run();

while (length > 0) {

runing();

}

}

// 在需要回调数据的地方(两个子类需要),声明一个接口

public static interface Calltoback {

public void win();

}

// 2.创建接口对象

public Calltoback calltoback;

}

创建一个人物类,创建人物张三和李四共同去挖矿,用一个数字5代表金矿,声明随机数,当挖到金矿的时候,当前线程打印“呵呵,挖到金矿了”并且礼让线程,一共挖30次金矿,统计每个人挖到金矿的次数。

/**

*

*/

package thread;

import java.util.Random;

public class jinKuangClass {

public static void main(String[] args) throws Exception{

personClassJinKuang personClass=

new personClassJinKuang();

new Thread(personClass, "张三").start();

new Thread(personClass, "李四").start();

}

}

class personClassJinKuang implements Runnable{

static int num=0;

Random RandomNum=new Random();

@Override

public void run() {

while(true){

int tuZiNum=RandomNum.nextInt(10);

System.out.println("生成的随机数为"+tuZiNum);

synchronized (this) {

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

if(tuZiNum==5){

num++;

System.out.println(Thread.currentThread()

.getName()+"抢到当前CPU,现在挖到的金矿次数为"+num+"次");

//个人理解:礼让就是选择放弃独占CPU,

//选择和其他线程分享抢到的CPU

if(num%5==0){

Thread.yield();

//yield英[jiːld]

//美[jiːld]

//v.出产(作物); 产生(收益、效益等);

//提供; 屈服; 让步; 放弃; 缴出;

//n.产量; 产出; 利润;

System.out.println(Thread.currentThread()

.getName()+"进行了礼让");

}}

if(num==100){

try {

Thread.sleep(100);

System.out.println("休息一下");

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if(num>=200){

break;

}

}

}

}

}

个人对守护线程的理解:

java回调函数的生命_Java车票,车站,生命周期,龟兔赛跑,同步锁,礼让,守护线程,挖金矿【诗书画唱】...相关推荐

  1. Java 回调函数的理解

    以下是我对java回调函数的理解,希望对各位有帮助. 简而言之,假设有两个类A与B,还有一个回调接口C(有一个c方法).其中A类持有一个B类对象作为属性和拥有一个a方法,并实现了接口C,所以A类中就有 ...

  2. [实战]java回调函数

    下面使用java回调函数来实现一个测试函数运行时间的工具类: 如果我们要测试一个类的方法的执行时间,通常我们会这样做: java 代码 public   class  TestObject { /** ...

  3. java反射回调函数_用J2V8注册Java回调函数

    J2V8是一套针对谷歌的V8 JavaScript引擎的Java绑定.J2V8的开发为Android平台带来了高效的Javascript的执行环境,taris.js 就是基于J2V8开发的.J2V8同 ...

  4. Java回调函数理解和应用

    #Java回调函数理解和应用 所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的. 在未理解之前,我也是一脸懵逼,等我理 ...

  5. Java 回调函数详解及使用

    Java 回调函数详解 前言: C语言中回调函数解释: 回调函数(Callback Function)是怎样一种函数呢? 函数是用来被调用的,我们调用函数的方法有两种: 直接调用:在函数A的函数体里通 ...

  6. Java 回调函数(传统方法和lambda方法)-一个例子秒懂

    原文地址为: Java 回调函数(传统方法和lambda方法)-一个例子秒懂 背景: 想写一个工具类 Tool.java ,其中方法 public void readOneLine() 负责一行一行地 ...

  7. java回调函数的生命_Java的回调函数 - choaklin 的个人空间 - OSCHINA - 中文开源技术交流社区...

    暂且不提回调函数的各种定义,如我本人,虽然知道JavaScript的回调的使用,但是百科了回调的定义,还是觉得云里来雾里去.所以大可先从已熟悉的入手,旁推侧引它的原理,再引出Java版的实现. 因为博 ...

  8. java 自定义函数的调用_Java/Android中的函数调用回调函数自定义回调函数

    在做Android自定义控件时遇到要自定义回调函数的问题,想想自己还暂时没有那么精深的技术,赶紧返过头回来再重新研究Java中回调函数的问题.然而不幸的是,网上太多杂乱的帖子和博客都是转来转去,而且都 ...

  9. java回调函数的生命_indexDB出坑指南

    对于入了前端坑的同学,indexDB绝对是需要深入学习的. 本文针对indexDB的难点问题(事务和数据库升级)做了详细的讲解,而对于indexDB的特点和使用方法只简要的介绍了一下.如果你有一些使用 ...

最新文章

  1. 数据结构与算法之美02
  2. 多库多事务降低数据不一致概率
  3. 快速搭建centos7
  4. vos3000v2.1.6.0客户端 vos3000 6.0下载
  5. grubbs准则 matlab_(转)格拉布斯准则(Grubbs Criterion)处理数据异常
  6. 计算机考研自学,自学考研计算机
  7. Android重难点解析——面试中可能被问到的那些问题
  8. 入职要求提供上家公司的工资银行流水?
  9. chrome 打印布局_Chrome 网页打印中的宽度控制
  10. 论文阅读 | Analysis and comparison of MIMO radar waveforms MIMO雷达波形总结 (TDMA, CDMA, DDMA, FDMA等)
  11. 【Python实战】推文助手好用吗?真的能赚钱吗?教您一招,有了这款微信自动发送消息小助手,文字自动跳出来~赚麻了(赶紧收藏)
  12. 第三部分 :简单句的补充(限定词/形容词/介词短语)
  13. 怎么用python实现回归_手把手教你用Python进行回归(附代码、学习资料)-阿里云开发者社区...
  14. python积木式编程_实例讲解python函数式编程
  15. Micromedia 发布DevNet最终资源开发包
  16. ai怎样导出所选部分,AI 怎么导出部分文件
  17. Qt实现PC端微信中的聊天气泡
  18. 本地web服务器配置(IIS)
  19. 达达财报:赚钱与烧钱的平衡大考
  20. STM32模拟串口驱动(带校验位)

热门文章

  1. JsonResult工具类
  2. 23届秋招,寒气逼人。。
  3. VS配置FFmpeg踩坑后的成功版
  4. 如何制作App隐私政策html
  5. C++数据可视化MathGL使用简示
  6. CDQ分治【分治(真得头疼)
  7. FFmpeg视频解码硬件加速
  8. THUWC2018WC2018游记
  9. Repeater ItemDataBound
  10. Fashion-Gen: The Generative Fashion Dataset and Challenge 论文解读数据集介绍