Java多线程,锁(synchronize),饿汉式单例线程,等待处理机制

一,礼让和守护线程

package com.much.hard;public class TestYieldProtect {public static void main(String[] args) {Yield1 y1 = new Yield1();y1.setName("A");Yield2 y2 = new Yield2();y2.setName("B");//y1.start();//y2.start();Daemon1 d1 = new Daemon1();d1.setName("boss");Daemon2 d2 = new Daemon2();d2.setName("bodygGuard");d2.setDaemon(true);d1.start();d2.start();// d2 本来要打印500次的,d1打印10次,可它是守护线程,老板挂了,它也挂了。// 守护线程的终止是自身无法控制的,因此千万不要把IO、File等重要操作逻辑分配给它;因为它不靠谱;// GC垃圾回收线程就是很好的例子。/* 当我们的程序中不再有任何运行的Thread,* 程序就不会再产生垃圾,垃圾回收器也就无事可做,* 所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开。* 它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。*/}}class Yield1 extends Thread {public void run() {for (int i = 0; i < 100; i++) {// 暂停当前正在执行的线程对象,并执行其他线程。让多线程执行更和谐,而不是一人一次。if (i == 9) yield();System.out.println(getName() + "\t" + i);}}
}class Yield2 extends Thread {public void run() {for (int i = 0; i < 100; i++) {System.out.println(getName() + "\t" + i);}}
}class Daemon1 extends Thread {public void run() {for (int i = 0; i < 10; i++) {System.out.println(getName() + "\t" + i);}}
}class Daemon2 extends Thread {public void run() {for (int i = 0; i < 500; i++) {System.out.println(getName() + "\t" + i);}}
}

礼让 当A线程是9时,让B线程执行。
在这里插入图片描述
二,加入线程

package com.much.hard;public class TestJoin {public static void main(String[] args) {System.out.println("main线程开启啦");Thread1 t1 = new Thread1();Thread2 t2 = new Thread2();t1.start();t2.start();// 让1,2线程加入main线程前面 两个线程开启... cpu分配交互执行。// t1,t2可用来计算,把结果反馈到main里面。try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("main线程结束啦");}public static void method() {}}class Thread1 extends Thread {public void run() {for (int i = 0; i < 100; i++) {System.out.println(getName() +": " + i);}}
}class Thread2 extends Thread {public void run() {for (int i = 0; i < 100; i++) {System.out.println(getName() +": " + i);}}
}

三,锁
有了锁,会让一个线程结束后,执行下一个线程。。。

package com.much.hard;public class TestSynchronize {public static void main(String[] args) {// 锁对同一个对象有用 this锁(同步代码块)Print p = new Print();ThreadShow1 ts1 = new ThreadShow1(p);ts1.start();ThreadShow2 ts2 = new ThreadShow2(p);ts2.start();/*Timer t = new Timer();Thread test = new Thread(t);test.start();*/// 里面new对象,和同传入同一个对象的区别。要同一个对象作为锁。// 问题1, abcd  1234 间隔的出现? cpu的资源随机分配。// 问题2,用锁解决,锁住方法,等这个方法(线程)执行完,再执行下一个线程。// 问题3,别人讲,可以来卖票。。。计数。。。}}class Print {public synchronized void printNum() {// 普通同步方法默认的锁时 this关键字System.out.print(1);System.out.print(2);System.out.print(3);System.out.println(4);}public void printLetter() {synchronized(this) {System.out.print("a");System.out.print("b");System.out.print("c");System.out.println("d");}}
}class ThreadShow1 extends Thread {// 第一个线程里面打印100条数字。Print p = null;public ThreadShow1() {}public ThreadShow1(Print p) {this.p = p;}public void run() {//Print p = new Print();for (int i = 0; i < 100; i++) {p.printNum();System.out.println(getName());}}
}class ThreadShow2 extends Thread {Print p = null;public ThreadShow2() {}public ThreadShow2(Print p) {this.p = p;}// 第二个线程打印100条字母。public void run() {//Print p = new Print();for (int i = 0; i < 100; i++) {p.printLetter();System.out.println(getName());}}
}// 实现Runnable接口。class Timer implements Runnable{public void run() {System.out.println("10秒计时,马上爆炸...");for (int i = 1; i <= 10; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(i);}		}
}

四,饿汉式单例
锁机制的应用。

package com.much.hard;public class TestSingle {public static void main(String[] args) {//二:编写多线程单例模式(懒汉式)//饿汉式,就不用考虑啥了,直接返回,不多bb。for (int i = 0; i < 20; i++) {my1 m = new my1();m.start();}}}class Dog {private static Dog dog = null;private Dog() {}public static Dog show() {if (dog == null) {	// 锁 一起执行。    synchronized(Dog.class) {if (dog == null) {// 线程休眠0.1秒。后再执行。try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}dog = new Dog();}}			}return dog;}
}class my1 extends Thread {public void run() {System.out.println(Dog.show());	}
}

五,等待处理机制

package com.much.hard;public class TestWaiting {public static void main(String[] args) {// 等待唤醒机制。// 需求,我想用线程实现 1 2  1 2  1 2  1 2... 的循环。PrintTwo pt = new PrintTwo();Wait1 w1 = new Wait1(pt);Wait2 w2 = new Wait2(pt);w1.start();w2.start();}}class PrintTwo {int i = 1;public synchronized void print1() {if (i != 1) {try {this .wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(1);i = 2;// 唤醒下个线程。// notify是唤醒等待中的一个(随机的)获取对象锁,进入可运行状态,this.notify();}public synchronized void print2() {if (i == 1) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}	}System.out.println(2);i = 1;this.notify();	}
}class Wait1 extends Thread {PrintTwo pt = null;public Wait1() {}public Wait1(PrintTwo pt) {this.pt = pt;}public void run() {while (true)pt.print1();}
}class Wait2 extends Thread {PrintTwo pt = null;public Wait2() {}public Wait2(PrintTwo pt) {this.pt = pt;}public void run() {while (true)pt.print2();}
}

哈哈哈,初学线程,有点点懵,一下子太多了,我只是把老师讲的小demo写了一遍,应用还没有基本。再此做下笔记。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

升级ADT22.6后,Android模拟器无法创建

这 两天&#xff0c;在社区里看到有小伙伴们反应&#xff0c;自己在Eclipse下无法创建Android模拟器的问题。起初&#xff0c;自己也没太在意&#xff0c;我一直使用的是 Genymotion模拟器。然后&#xff0c;问题不解决&#xff0c;总有那么一天会让自己碰到的。这不&#xff0…

原来js的parseInt函数还可以这样用

QQpc端登录账号还可以这样玩&#xff01;&#xff01;&#xff01; 图片上来。 wow&#xff0c;我惊呆了。 居然可以登录进出&#xff1f;&#xff01; 都知道&#xff0c;登录会验证账号是整数&#xff0c;文本框输入的是字符串&#xff0c;会把字符串转成整数&#xff0c; 而…

实验1 熟悉实验环境

本操作系统实验的硬件环境是IA-32(x86)架构的PC机&#xff08;就是你现在正在使用的计算机&#xff09;&#xff0c;主要软件环境是Bochs gcc 你最喜欢的编辑器/IDE 你最喜欢的操作系统 Linux 0.11源代码。实验的基本流程是根据实验要求编写应用程序、修改Linux 0.11的源代…

前端学习(1032):jquery插件-瀑布流

1网址打开 下载插件 2引入css和js和html 3修改图片

实验2 操作系统的引导

操作系统的引导 实验目的 熟悉hit-oslab实验环境&#xff1b;建立对操作系统引导过程的深入认识&#xff1b;掌握操作系统的基本开发过程&#xff1b;能对操作系统代码进行简单的控制&#xff0c;揭开操作系统的神秘面纱。 实验内容 此次实验的基本内容是&#xff1a; 阅读《…

从Tom说JSP原理

第一次执行&#xff1a; 客户端通过电脑连接服务器&#xff0c;因为是请求是动态的&#xff0c;所以所有的请求交给WEB容器来处理在容器中找到需要执行的*.jsp文件之后*.jsp文件通过转换变为*.java文件.java文件经过编译后&#xff0c;形成.class文件最终服务器要执行形成的*.…

前端学习(1033):jquery插件-图片懒加载

1下载插件 2html css和js引入 ctrlh 快速替换 必须最后插入

对自己有用的VS调试技巧

设置下一条语句编辑然后继续符号越界后查看堆对象查看数组的值底部设置下一条语句 返回顶部 一个典型的调试情况就是通过单步跟踪分析为什么一个函数调用失败了。当你发现一个函数调用的另一个函数返回错误的时候你会怎么做&#xff1f;重启调试&#xff1f;有更好的方法。拖动…

前端学习(1034):jquery插件-全屏滚动

fullpage.js 1下载插件 js css html 4引入

实验4 [bx]和loop的使用

(1) assume cs:codesgcodesg segmentmov ax, 0mov ds, axmov bx, 200H ;ds:bx数据区mov cx, 40hmov dl, 0 s: mov ds:[bx], dl ;dl中间变量inc bxinc dlloop smov ax, 4c00h int 21hcodesg ends end实验结果&#xff1a; &#xff08;2&#xff09; 考虑&#xff08;1&#…

面试 jsp转发和重定向

转发 HttpServletRequest 用法 req.getRequestDispatcher("studentServlet").forward(req, resp);重定向 HttpServletResponse 用法 resp.sendRedirect("studentServlet");区别 转发的主导权在服务器,重定向的主导权在客户端 转发可以用request传递数据…

前端学习(1035):bootstrap-js插件1

1引入css和js 2复制html 组件 3运行之后得到下拉框

面试之JSP九大内置对象和JSP四大作用域

jsp 九大内置对象和其作用详解 JSP中一共预先定义了9个这样的对象&#xff0c;分别为&#xff1a;request、response、session、application、out、pagecontext、config、page、exception 1、request对象 request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象…

实验5 编写、调试具有多个段的程序

本章实验的主题主要讲代码段、数据段、栈段的使用。 &#xff08;1&#xff09; assume cs:code, ds:data, ss:stackdata segmentdw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data endsstack segmentdw 0, 0, 0, 0, 0, 0, 0, 0 stack endscode segment start:…

前端学习(1036):bootstrap-js插件2

1大模态框 引入html 自己定义 2说明 就可以显示 js调用 script

实验6 实践课程中的程序

本实验书中已经有源码&#xff08;158页&#xff09;&#xff0c;稍微改动一下即可。本题中值得学习的地方就是用双重循环遍历二位数组&#xff0c;这在C语言中很简单&#xff0c;但是在汇编中要注意cx的在内外层循环之间的切换情况。 assume cs:codesg, ds:datasg, ss:stacksg…

字符流读取,乱码问题

碰到问题&#xff0c;字符流读取文本文件&#xff0c;读取输出&#xff0c;强转成char出现乱码问题。 题目 用流统计文本文件的字符个数 public static int getSum() {int count 0;BufferedReader br null;try {// 字节流转换为字符流&#xff0c; 设置编码。br new Buffere…

实验7 寻址方式在结构化数据访问总的应用

做本实验时明显感觉寄存器不够用&#xff0c;所以要对bx&#xff0c;si&#xff0c;di&#xff0c;bp的使用仔细阅读&#xff0c;本题比较琐碎&#xff0c;做本题更需要的是耐心&#xff0c;耐心&#xff0c;耐心。 assume cs:codedata segment db 1975,1976,1977,1978,1979,…