`

corejava学习7(多线程)

阅读更多

Cpu内部是串行的是分时执行,在外面是并行的

 

 

 

 

多线程

 

1              继承  Thread   public void run()

2              实现   Runnable接口   实现public void run()

 

阻塞状态

 


T2阻塞,t1继承运行

                                                   

初始状态

终止状态

1 等待输入

2 threadsheep()

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,任何对象都有一个等待队列,用来存放线程

 

t1o调用wait方法,必须放在对o加锁的同步代码块中! 1.t1会释放其所拥有的所有锁标记;2.t1会进入o的等待队列

 

t2o调用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多线程学习总结.pdf

    corejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习...

    达内 CoreJava老师笔记汇总

    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

    java学习文档(快速学习-非常使用)

    七、 CoreJava中的注释 八、 jar命令的用法 九、计算机编译一个java程序的过程 十、import声明的作用 。。。。。。。。。。。。。。 Day11 《多线程》 Day12 一.I/O 流(java 如何实现与外界数据的交流)

    Java笔记Core java

    java课堂的笔记,自己学习java的一些心得体会。希望对初学者有帮助。 可以加入群114056096交流

    java学习笔记 达内笔记(经典)

    (二)面向对象技术总结.pdf (三)corejava高级特性总结 (四)接口学习总结 (五)异常和内部类 (六)集合框架学习总结 (七)GUI和AWT事件模型 (八)多线程学习总结 (九)输入输出流学习总结 (十)网络编程学习总结

    达内 coreJava 习题答案

    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 ...

    达内Java笔记 各种总结

    面向对象技术总结 corejava高级特性总结 接口学习总结 异常和内部类 集合框架学习总结 GUI和AWT事件模型 多线程学习总结 输入输出流学习总结 网络编程学习总结

    Java超神之路.rar

    1.CoreJava,就是java基础、JDK的类库,很多童鞋都会说,JDK我懂,但是懂还不足够,知其然还要知其所以然,JDK的源代码写的非常好,要经常查看,对使用频繁的类,比如String,集合类(List,Map,Set)等数据结构要...

    java-core:JAVA集合包,线程池,并发包,NIO等API及链接相关学习

    Java核心 JAVA多线程,集合,并发相关学习,日行一码

    java核心技术

    义的应用实例,详细介绍了Java语言基础知识、面向对象程序设计、接口, 与内部类、事件监听器模型、swing图形用户界面程序设计、打包应用程序, 、异常处理、登录与调试、泛型程序设计、集合框架、多线程等内容。...

    java多线程编程核心技术源码-encog-dotnet-core:encog-dotnet-核心

    java多线程编程核心技术源码 注意:名称“Encog Core”会与 Microsoft .Net Core 混淆。 此版本的 Encog 与 Microsoft 的 .Net Core 版本无关。 我很想更改 Repo 和 NuGet 的名称,但在这一点上这将是巨大的。 Encog...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    Java核心技术

    义的应用实例,详细介绍了Java语言基础知识、面向对象程序设计、接口, 与内部类、事件监听器模型、swing图形用户界面程序设计、打包应用程序, 、异常处理、登录与调试、泛型程序设计、集合框架、多线程等内容。...

    JAVA核心技术

    义的应用实例,详细介绍了Java语言基础知识、面向对象程序设计、接口, 与内部类、事件监听器模型、swing图形用户界面程序设计、打包应用程序, 、异常处理、登录与调试、泛型程序设计、集合框架、多线程等内容。...

    sun公司开发的,java2核心技术,卷II

    java2核心技术,卷II:高级性能,包括一系列的高级java应用技术,如数据库德连接,高级swing,多线程,软件本地化等等,本文件中则包含该书中的所用实例,配合该书使用,使对java的学习更具效率-sun developed, java2 core ...

    JAVA上百实例源码以及开源项目

    笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...

    《Java2核心技术》笔记

    《Java2核心技术》笔记 作者:叶加飞 加拿大.达内科技 (上海中心) 笔记包含以下文档: 面向对象技术总结.pdf corejava高级个性总结.pdf ...多线程学习总结.pdf 输入输出流学习总结.pdf 网络编程学习总结.pdf

    java-core:java核心技术项目

    Java核心功能模块(针对对象,异常处理,多线程,io,集合框架,网络编程) 算法与数据结构(8种常见排序,二叉树) 常见面试题 写在前面 核心依赖 / src / com / resources / lib 模块说明 根据 中间的 启动说明 ...

Global site tag (gtag.js) - Google Analytics