`

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学习笔记

    ### CoreJava学习笔记 #### 一、JAVA特点与运行原理 **JAVA特点:** 1. **简单性**:Java的设计者们将C++语言中许多不易理解和容易混淆的部分去除,使得Java更容易理解与掌握。 2. **面向对象**:Java几乎一切都...

    core java 学习java的书籍

    书中的内容覆盖了Java语言的基础语法、面向对象编程、异常处理、多线程、集合框架、输入输出、网络编程等多个方面,是学习Java不可或缺的参考资料。 首先,关于Java基础,本书详细介绍了变量、数据类型、运算符、...

    Core Java

    掌握这些基础概念和规则是学习Core Java的起点,随着深入学习,还将涉及异常处理、输入/输出、集合框架、多线程、网络编程等更多内容。对于初学者来说,理解并熟练运用这些知识是成为Java程序员的第一步。

    达内 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

    corejava学习笔记.doc

    Java是一种由Sun Microsystems在1995年推出的高级编程语言,现由Oracle公司维护。...以上就是Core Java学习笔记的主要内容概述,涵盖了从基础语法到高级特性的广泛知识,为深入理解和应用Java打下了坚实的基础。

    corejava7源码

    Core Java 7,即《Core Java Volume I - Fundamentals》的第七版,它深入探讨了Java语言的核心特性,包括面向对象编程、集合框架、异常处理、多线程、输入/输出流以及网络编程等多个方面。源码分析对于理解这些概念...

    java\CoreJava笔记\CoreJAVA_day01

    在学习CoreJava时,我们需要掌握以下几个关键知识点: 1. **编程思想**: - 面向对象编程(Object-Oriented Programming, OOP):Java是一种纯面向对象的语言,一切皆为对象,理解类、对象、封装、继承、多态等...

    CoreJava视频课程(百度云链接)

    根据提供的文件信息,我们可以推断出这是一套关于CoreJava的视频教程。下面将围绕CoreJava的核心知识点进行详细的介绍。 ### CoreJava基础知识 #### Java语言简介 Java是一种广泛使用的、面向对象的编程语言,由...

    COREJAVA学习代码

    "COREJAVA学习代码"这个主题旨在帮助开发者深入理解和掌握Java的基本语法、类库以及编程实践。下面将详细阐述一些核心Java的学习知识点,这些知识点通常会在课堂讲解和教师布置的作业中出现。 1. **基础语法**:...

    core java 学习文档

    这只是Core Java学习文档的冰山一角,后续章节还会深入到类和对象、异常处理、输入输出、集合框架、多线程、网络编程等方面。掌握Core Java是成为熟练Java程序员的必经之路,它能帮助你构建坚实的基础,为更高级的...

    corejava,java核心编程

    【标签】:“corejava” 在计算机编程领域,Core Java是指Java的核心部分,它是Java技术的基础,涵盖了Java语言的基础语法、面向对象编程概念、图形用户界面(GUI)开发以及网络编程等方面。以下是对这些知识点的...

    学习笔记 java\CoreJava笔记\CoreJava_day11

    CoreJava_day11的学习笔记主要涵盖了集合框架,特别是关于List、Set和Map接口,以及ArrayList、Vector和LinkedList等具体实现类的知识点。 首先,集合框架是用来存放对象的对象,它提供了一组接口和类,使得我们...

    corejava7.zip

    "corejava7.zip"这个压缩包文件包含了与学习Java核心概念相关的代码示例,是初学者和进阶者调试及理解Java编程的宝贵资源。其中,"v1"可能代表了该代码库的第一个版本,意味着它可能包含了Java 7的基本特性和用法。 ...

    core java1&2

    《Core Java 1&2》是Java编程领域中两本非常经典的教材,分别对应于卷1和卷2,英文版提供了全面且深入的Java学习资源。这两本书由Cay S. Horstmann和Gary Cornell撰写,是许多程序员入门和进阶Java技术的重要参考书...

    Core Java( Java 核心) PDF 教材

    6. **多线程编程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口、synchronized关键字、volatile属性以及线程池。这部分内容对于开发高性能、高并发的应用至关重要。 7. **输入/输出流**:Java的I/O流...

    core java学习课件

    7. **多线程**: Java提供了内置的多线程支持,理解线程的创建、同步和通信对于开发并发应用程序非常重要。 8. **异常处理**: 异常是程序运行时可能出现的问题,学习如何有效地捕获和处理异常可以提高程序的健壮性。...

    corejava(source)

    Java提供了强大的多线程支持,CoreJava源码涵盖了线程的创建、同步、通信等关键知识点。通过对这部分源码的学习,我们可以理解线程的生命周期、线程安全问题以及如何使用synchronized关键字、wait()、notify()等方法...

    CoreJava CoreJava

    《CoreJava CoreJava CoreJava 基础学习》 在Java编程领域,"CoreJava"通常指的是Java语言的核心部分,不涉及高级特性如Java EE(企业版)或Android开发。这个概念涵盖了Java语言的基础语法、类库以及面向对象编程...

    corejava12示例代码

    《CoreJava12示例代码》是一份针对Java编程语言深度学习的重要资源,主要涵盖了CoreJava12版本中的核心概念和特性。这份压缩包文件包含了丰富的示例代码,旨在帮助开发者深入理解Java语言的各个方面,提升编程技能。...

Global site tag (gtag.js) - Google Analytics