Cpu内部是串行的是分时执行,在外面是并行的
多线程
1 继承 Thread类 中public void run()
2 实现 Runnable接口 实现public void run()
1 等待输入
2 thread。sheep()
3 t2:t1.join()
|
Os选 中
public class TestThread {
public static void main(String[] args) {
Thread t1=new ThreadA();
Runnable target=new Target();
Thread t2=new Thread(target);
t1.start();
t2.start();
}
}
class ThreadA extends Thread{
public void run(){
for(int i=1;i<=100;i++){
System.out.println(i+" $$$");
try {
Thread.sleep(100);
} catch (InterruptedException e) {}
}
}
}
class Target implements Runnable{
public void run(){
for(int i=1;i<=100;i++){
System.out.println(i+" ###");
try {
Thread.sleep(100);
} catch (InterruptedException e) {}
}
}
}
结果:
1 $$$
1 ###
2 ###
2 $$$
3 ###
3 $$$
4 $$$
4 ###
5 $$$
5 ###
6 ###
6 $$$
7 ###
7 $$$
8 $$$
8 ###
9 $$$
9 ###
10 $$$
10 ###
11 $$$
11 ###
12 $$$
线程:进程中并发的一个顺序执行流程
并发原理:CPU分时间片,多线程交替运行
宏观并行,微观串行
线程三要素:CPU Data Code
多线程间堆空间共享,栈空间独立
创建线程两种方式:继承Thread类,实现Runnable接口
Thread对象代表了一个线程
多线程共同访问了同一个对象(临界资源),如何破坏了不可分割的操作(原子操作),就会造成数据不一致的情况
在Java中,任何对象都有一个互斥锁标记,用来分配给线程.
synchronized(o){} 对o加锁的同步代码块
只有拿到o的锁标记的线程,才能进入对o加锁的同步代码快,退出同步代码块,会自动释放o的锁标记
public synchronized void m(){} 同步方法,对this加锁
哪个线程能拿到对象的锁,哪个线程就能调用对象的同步方法
在Java中,任何对象都有一个锁池,用来存放等待该对象锁标记的线程
一个线程,可以同时拥有多个对象的锁标记,线程阻塞在对象锁池中时,不会释放其所拥有的其他对象的锁标记
在Java中,任何对象都有一个等待队列,用来存放线程
t1对o调用wait方法,必须放在对o加锁的同步代码块中! 1.t1会释放其所拥有的所有锁标记;2.t1会进入o的等待队列
t2对o调用notify/notifyAll方法,也必须放在对o加锁的同步代码块中! 会从o的等待队列中释放一个/全部线程 对t2毫无影响
public class TestProducerConsumer {
public static void main(String[] args) {
MyStack ms=new MyStack();
Thread t1=new Producer(ms);
Thread t2=new Consumer(ms);
t1.start();
t2.start();
}
}
class MyStack{
char[] data=new char[6];
int index=0;
private void print(){
for(int i=0;i<index;i++){
System.out.print(data[i]+" ");
}
System.out.println();
}
public synchronized void push(char c){
while(index==data.length){
try {
this.wait();
} catch (InterruptedException e) {}
}
System.out.print(c+" pushed! ");
data[index]=c;
index++;
this.notifyAll();
print();
}
public synchronized void pop(){
while(index==0){
try {
this.wait();
} catch (InterruptedException e) {}
}
index--;
System.out.print(data[index]+" poped! ");
data[index]=' ';
this.notifyAll();
print();
}
}
class Producer extends Thread{
MyStack ms;
public Producer(MyStack s){
this.ms=s;
}
public void run(){
for(char c='A';c<='Z';c++){
ms.push(c);
}
}
}
class Consumer extends Thread{
MyStack ms;
public Consumer(MyStack s){
this.ms=s;
}
public void run(){
for(int c=1;c<=26;c++){
ms.pop();
}
}
}
public class TestNumberCharPrint {
public static void main(String[] args) {
Object o=new Object();
Thread t1=new NumberThread(o);
Thread t2=new CharThread(o);
t1.start();
t2.start();
}
}
class NumberThread extends Thread{
Object o;
public NumberThread(Object o){
this.o=o;
}
public void run(){
synchronized (o) {
for (int i = 1; i <= 26; i++) {
System.out.println(i * 2 - 1);
System.out.println(i * 2);
o.notifyAll();
try {
if (i!=26) o.wait();
} catch (InterruptedException e) {
}
}
}
}
}
class CharThread extends Thread{
Object o;
public CharThread(Object o){
this.o=o;
}
public void run(){
synchronized (o) {
for (char c = 'A'; c <= 'Z'; c++) {
System.out.println(c);
o.notifyAll();
try {
if (c!='Z') o.wait();
} catch (InterruptedException e) {}
}
}
}
}
结果:
A
1 2
B
3 4
………
分享到:
相关推荐
corejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习...
CoreJava DAY01 Java概述 1 CoreJava DAY02 数据类型和控制结构 10 CoreJava DAY03 数组 20 CoreJava DAY04 27 ...CoreJava DAY19-20 多线程 154 CoreJava DAY21-22 IO 174 CoreJava DAY23 网络编程 197
七、 CoreJava中的注释 八、 jar命令的用法 九、计算机编译一个java程序的过程 十、import声明的作用 。。。。。。。。。。。。。。 Day11 《多线程》 Day12 一.I/O 流(java 如何实现与外界数据的交流)
java课堂的笔记,自己学习java的一些心得体会。希望对初学者有帮助。 可以加入群114056096交流
(二)面向对象技术总结.pdf (三)corejava高级特性总结 (四)接口学习总结 (五)异常和内部类 (六)集合框架学习总结 (七)GUI和AWT事件模型 (八)多线程学习总结 (九)输入输出流学习总结 (十)网络编程学习总结
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 //循环嵌套,打印九九乘法表 public ...
面向对象技术总结 corejava高级特性总结 接口学习总结 异常和内部类 集合框架学习总结 GUI和AWT事件模型 多线程学习总结 输入输出流学习总结 网络编程学习总结
1.CoreJava,就是java基础、JDK的类库,很多童鞋都会说,JDK我懂,但是懂还不足够,知其然还要知其所以然,JDK的源代码写的非常好,要经常查看,对使用频繁的类,比如String,集合类(List,Map,Set)等数据结构要...
Java核心 JAVA多线程,集合,并发相关学习,日行一码
义的应用实例,详细介绍了Java语言基础知识、面向对象程序设计、接口, 与内部类、事件监听器模型、swing图形用户界面程序设计、打包应用程序, 、异常处理、登录与调试、泛型程序设计、集合框架、多线程等内容。...
java多线程编程核心技术源码 注意:名称“Encog Core”会与 Microsoft .Net Core 混淆。 此版本的 Encog 与 Microsoft 的 .Net Core 版本无关。 我很想更改 Repo 和 NuGet 的名称,但在这一点上这将是巨大的。 Encog...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
义的应用实例,详细介绍了Java语言基础知识、面向对象程序设计、接口, 与内部类、事件监听器模型、swing图形用户界面程序设计、打包应用程序, 、异常处理、登录与调试、泛型程序设计、集合框架、多线程等内容。...
义的应用实例,详细介绍了Java语言基础知识、面向对象程序设计、接口, 与内部类、事件监听器模型、swing图形用户界面程序设计、打包应用程序, 、异常处理、登录与调试、泛型程序设计、集合框架、多线程等内容。...
java2核心技术,卷II:高级性能,包括一系列的高级java应用技术,如数据库德连接,高级swing,多线程,软件本地化等等,本文件中则包含该书中的所用实例,配合该书使用,使对java的学习更具效率-sun developed, java2 core ...
笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...
《Java2核心技术》笔记 作者:叶加飞 加拿大.达内科技 (上海中心) 笔记包含以下文档: 面向对象技术总结.pdf corejava高级个性总结.pdf ...多线程学习总结.pdf 输入输出流学习总结.pdf 网络编程学习总结.pdf
Java核心功能模块(针对对象,异常处理,多线程,io,集合框架,网络编程) 算法与数据结构(8种常见排序,二叉树) 常见面试题 写在前面 核心依赖 / src / com / resources / lib 模块说明 根据 中间的 启动说明 ...