`
lvwenwen
  • 浏览: 953958 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

多线程高新(黑马程序员)

阅读更多
---------------------------------  Java多线程与并发库高级应用  -------------------------------------------
  1.传统线程机制的回顾
  1.多个线程对同一个数据进行操作(加synchronized()),要线程同步,静态方法只有跟字节码关联,类的字节码是万能的,字节码只有一份
  1.线程同步的方法
  public void output(String name){
int len = name.length();
synchronized (Outputer.class)
{
for(int i=0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}


public  synchronized  void  output2(String name){
int len = name.length();
for(int i=0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
  2.java5线程的新特性:
  1.ExecutorService threadPool = Executors.newFixedThreadPool(3);
  2.private static Lock lock = new ReentrantLock();
  3.private static Condition subThreadCondition = lock.newCondition();
例题:
private static Lock lock = new ReentrantLock();
private static Condition subThreadCondition = lock.newCondition();
private static boolean bBhouldSubThread = false;
public static void main(String [] args)
{
ExecutorService threadPool = Executors.newFixedThreadPool(3);
threadPool.execute(new Runnable(){
public void run()
{
for(int i=0;i<50;i++)
{
lock.lock();
try
{
if(!bBhouldSubThread)
subThreadCondition.await();
for(int j=0;j<100;j++)
{
System.out.println(Thread.currentThread().getName() + ",j=" + j);
}
bBhouldSubThread = false;
subThreadCondition.signal();
}catch(Exception e)
{
}
finally
{
lock.unlock();
}
}
}

});
threadPool.shutdown();
for(int i=0;i<50;i++)
{
lock.lock();
try
{
if(bBhouldSubThread)
subThreadCondition.await();
for(int j=0;j<10;j++)
{
System.out.println(Thread.currentThread().getName() + ",j=" + j);
}
bBhouldSubThread = true;
subThreadCondition.signal();
}catch(Exception e)
{
}
finally
{
lock.unlock();
}
}
}
1.ExecutorService threadPool = Executors.newSingleThreadExecutor(); threadPool 线程池
线程池:创建一些线程,它们的集合称为线程池,当服务器接受到一个客户请求后,就从线程池中取出一个空闲的线程为之服务,服务完后不关闭该线程,而是将该线程还回到线程池中。
2.子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序
源代码:(用java5线程的新特性实现,ReentrantLock,Condition)
/**
* @param args
*/
public static void main(String[] args) {

final Business business = new Business();
new Thread(
new Runnable() {
public void run() {

for(int i=1;i<=50;i++){
business.sub(i);
}

}
}
).start();

for(int i=1;i<=50;i++){
business.main(i);
}

}

static class Business {
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
  private boolean bShouldSub = true;
  public  void sub(int i){
  lock.lock();
  try{
  while(!bShouldSub){
  try {
condition.await();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
  }
for(int j=1;j<=10;j++){
System.out.println("sub thread sequence of " + j + ",loop of " + i);
}
  bShouldSub = false;
  condition.signal();
  }finally{
  lock.unlock();
  }
  }
 
  public  void main(int i){
  lock.lock();
  try{
while(bShouldSub){
  try {
condition.await();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
  }
for(int j=1;j<=100;j++){
System.out.println("main thread sequence of " + j + ",loop of " + i);
}
bShouldSub = true;
condition.signal();
  }finally{
  lock.unlock();
  }
  }

}
2.Semaphore实现信号灯
ExecutorService service = Executors.newCachedThreadPool();
final  Semaphore sp = new Semaphore(3);
  3.同步工具类(CyclicBarrier,用于等待(比如旅游),CountDownLatch(计时器,倒计时),Exchanger(交换器,用于交换,比如买卖品))
  4.可阻塞的队列(ArrayBlockingQueue,final BlockingQueue queue = new ArrayBlockingQueue(3);)
  5.删除集合时会报错,用 Collection users = new CopyOnWriteArrayList();
  Java5中提供了如下一些同步集合类:
  通过看java.util.concurrent包下的介绍可以知道有哪些并发集合
  ConcurrentHashMap
  CopyOnWriteArrayList
  CopyOnWriteArraySet
5.面试题用到的知识点
//队列,可阻塞队列
final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1);
//信号灯
final Semaphore semaphore = new Semaphore(1);
final SynchronousQueue<String> queue = new SynchronousQueue<String>();
//操作集合的存取时,用CopyOnWriteArrayList,可以获取condition,lock
private CopyOnWriteArrayList keys = new CopyOnWriteArrayList();
 
1. 总之,要同步互斥的几段代码最好是分别放在几个独立的方法中,这些方法再放在同一个类中,这样比较容易实现它们之间的同步互斥和通信
* 面试题需求:设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序
* 根据题目要求,很明显要用到线程同步(synchronized)
* 用到的知识点,同步synchronized()方法, 外部类调用内部类的方法
*  ThreadTest1 tt=new ThreadTest1();
Inc inc= tt.new Inc();
* Thread t=new Thread(inc); //传一个runnable对象inc 进去 

1.内部类特点:1.内部类中不允许定义静态变量2.在内部类中访问外部类中与内部类同名的实例变量用外部类名.this.变量名
3.如果内部类中没有与外部类同名的变量,则可以直接用变量名访问外部类变量
4.可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的
condition 阻塞队列  队列:先进先出

blockingQueueTest.java 阻塞队列

成员变量只有创建类的实例才赋值
静态代码块只有在类加载的时候执行,只会执行一次

匿名构造方法有几个构造方法就调用几次

死锁:都堵住了,方法不能执行

内部类可以访问外部类的对象

线程互斥一定是同一个对象

外部类怎样调用类部类的方法

AtomicInteger


任何线程死了,怎样再启动

多态::“一个接口,多种实现”,就是同一种事物表现出的多种形态。
ReadWriteLock  ReentrantReadWriteLock

Condition

线程的同步,安全,什么时候用线程异步
同步的数据是安全的还是不安全的
concurrent
ExecutorService 线程池

数组就是连续的一段内存,列表不是一段连续的内存
如果线程被多个应用访问,用ConcurrentHashMap

要实现同步(synhronized) 接受的对象(监视器对象必须是同一个,即传入的对象(this))
同步即互斥,进了这里,就不能进那里

Clooections --->synchronizedMap --->map 的线程同步
Collections.synchronizedMap(null)

HashSet 与HashMap 有什么联系
HashSet 内部使用的是hashMap实现 只是用hashMap key,没有value

使用new Runnable 更面向对象 Runnable 表示一个对象,Runnable表示代表任务的那个对象

Test  同步队列

编译器把代码翻译成字节码 编译器优化
String a =new String("a");  a与b不是同一个对象
String b=new String("a");
a="1"+"";
b="1"+""; a与b是同一个对象

只有满足synchronize(this)
这个this代表的对象是同一个是才互斥,否则不互斥
也就是不是线程同步

迭代的过程中不能对集合进行操作
用CopyOnWriterArrayList可以解决迭代过程中不能对集合进行
操作的问题

java5线程并发库里面的CopyOnWriterArrayList


s1知识点

s2知识点

分享到:
评论

相关推荐

    黑马程序员Javase笔记

    "黑马程序员Javase笔记"是一个自学者在学习黑马程序员提供的Java全套课程过程中整理的笔记,主要涵盖了Java Standard Edition (Javase) 的核心内容。下面将详细讨论其中的关键知识点。 首先,DOS命令是操作系统中的...

    黑马程序员-java多线程技术01

    本教程将聚焦于Java中的多线程技术,以“黑马程序员-java多线程技术01”为学习起点,探讨如何在Java中实现并管理线程。 首先,我们来理解什么是线程。线程是操作系统分配CPU时间的基本单元,一个进程中可以有多个...

    B站黑马程序员Python教程学习笔记.zip

    在B站黑马程序员的Python教程中,你将深入理解Python的基础概念,包括: 1. **变量与数据类型**:Python支持多种数据类型,如整型(int)、浮点型(float)、字符串(str)和布尔型(bool)。此外,还有列表(list...

    黑马程序员-Qt讲义.pdf

    Qt提供了多线程编程的支持,包括线程的基本概念介绍、多线程的使用方法和线程安全绘图等。在数据库操作方面,Qt也提供了强大的支持,包括数据库操作的基本概念、使用模型操作数据库和对数据库数据的可视化显示等。 ...

    黑马程序员2018python爬虫课件完整版

    黑马程序员作为知名的IT教育机构,其2018年的Python爬虫课程旨在教授学员如何有效地抓取和处理网络上的信息。在这个完整的课程中,你将深入理解Python爬虫的基本原理,并学习到一系列实用的技巧。 首先,Python之...

    黑马程序员-Java语言进阶-源码、教程笔记.zip

    day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda表达式 day08_File类、递归 day09_字节流、字符流 day10_缓冲流、转换流、序列化流、Files day11_网络编程 day12_函数式接口 day13_Stream...

    黑马程序员java贪吃蛇源码

    4. **多线程应用** - **游戏主线程**:负责游戏的主循环和逻辑处理。 - **GUI刷新线程**:为了保持流畅的游戏体验,GUI通常在独立的线程中刷新,避免因为更新界面导致游戏暂停。 5. **优化技巧** - **缓冲区策略...

    黑马程序员–Java多线程讲解笔记

    Java多线程是Java编程中不可或缺的部分,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文主要探讨了多线程的概念、应用场景...因此,理解和掌握Java的多线程技术对于任何Java程序员来说都是至关重要的。

    黑马程序员Android学习笔记

    《黑马程序员Android学习笔记》是一份专为初学者设计的详尽教程,旨在帮助那些希望踏入安卓开发领域的人员快速掌握核心知识。这份笔记涵盖了从基础到进阶的多个主题,帮助学习者系统地理解Android应用开发的过程。 ...

    黑马程序员安卓 笔记代码(包含源码) 第76期

    【标题】"黑马程序员安卓 笔记代码(包含源码) 第76期" 提供的是安卓开发的相关学习资料,其中包含了源码,这通常意味着我们可以深入理解代码的实现细节和设计思路。作为第76期,这可能是一个长期系列教程的一部分...

    传智播客.黑马程序员《Java 基础入门》课后习题答案

    1、 面向对象、跨平台性、健壮性、安全性、可移植性、多线程性、动态性等。 2、 JRE(Java Runtime Environment,Java 运行时环境),它相当于操作系统部分,提供了 Java 程序运 行时所需要的基本条件和许多 Java ...

    黑马程序员_张孝祥_Java多线程与并发库

    黑马程序员_张孝祥_Java多线程与并发库,老师讲的非常仔细,老师很有耐心.欢迎大家下载学习.

    黑马程序员_从零开始征服Android之旅(第一季)源码和笔记

    《黑马程序员_从零开始征服Android之旅(第一季)源码和笔记》是一份全面的Android开发学习资源,旨在帮助初学者系统地掌握Android开发技术,实现从理论到实践的跨越。这份资料涵盖了一系列关键知识点,包括但不限于...

    Java-IO流高级-例题 & 例题源码 & PPT教学文档(黑马程序员详细版).rar

    本资料包“Java-IO流高级-例题 & 例题源码 & PPT教学文档(黑马程序员详细版).rar”提供了一个深入学习Java IO流的全面资源,包含实例题目、源代码以及PPT教学材料,适合对Java IO有进阶需求的开发者。 1. **Java ...

    黑马程序员.NET入学测试题

    8. **多线程**:理解并发和同步的概念,如何在.NET中创建和管理线程。 9. **文件和I/O操作**:学习读写文件、流、XML处理等。 10. **网络编程**:了解套接字、HTTP协议、WebSocket等网络通信技术。 通过这份“黑马...

    黑马程序员Android视频教程

    ### 黑马程序员Android视频教程知识点解析 #### 一、Android基础概述 - **定义与特点**:Android是一种基于Linux内核(不包括GNU组件)的开源操作系统,主要用于移动设备。它由Google公司及其领导下的开放手机联盟...

    黑马程序员java面试宝典 完整版PDF.rar

    4. **多线程**:线程的创建(Thread类和Runnable接口)、线程同步(synchronized关键字、wait/notify机制、Lock接口)、线程池(ExecutorService)都是面试中的常见话题。 5. **IO/NIO/BIO**:输入输出流的使用,非...

    黑马程序员_(适合初学者入门的Java基础视频)

    8. **多线程**:介绍线程的概念,讲解如何创建和控制线程,以及同步机制,如synchronized关键字和wait/notify机制。 9. **Java API和类库**:通过实例演示如何使用Java标准库中的各种类,如Date、Calendar、Math等...

Global site tag (gtag.js) - Google Analytics