java 线程异常问题 并发性

问题描述

java 线程异常问题 并发性

package ListTest;

import java.util.ArrayList;

public class BookList {
ArrayList bl =new ArrayList();

public void chunBan(){
    Book b1= new Book();
    b1.setBid(1);
    b1.setName("java");
    b1.setPrice(32.00);
    bl.add(b1);

    Book b2 = new Book();
    b2.setBid(2);
    b2.setName("c++");
    b2.setPrice(56.00);
    bl.add(b2);
}

public void chaXun(int bid) {
    for (Book book : bl) {
        if (book.getBid()==bid) {
            System.out.println(book.getName()+"	"+book.getPrice());
        }
    }
}

public void  see() {
    for (Book book : bl) {
        System.out.println(book.getName());
    }
}

public  void update(int bid,double price) {
    for (Book book : bl) {
        if (book.getBid()==bid) {
            book.setPrice(price);
        }
    }
}

public void remove2(int bid) {
    for (Book book : bl) {
        if (book.getBid()==bid) {
            bl.remove(book);
        }
    }
}

public void jiXunChuBan(int bid,String name,double price) {
    int k=bl.size();
    Book b3 = new Book(bid,name,price);
    bl.add(k,b3);
}
public void qingKong() {
    bl.clear();
}

}

package ListTest;

public class Book {
private int bid;
private String name;
private double price;
public Book(int bid, String name, double price) {
super();
this.bid = bid;
this.name = name;
this.price = price;
}
public Book() {
super();
}
public int getBid() {
return bid;
}
public void setBid(int bid) {
this.bid = bid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}

}

package ListTest;

public class BookMain {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    BookList blist = new BookList();
    blist.chunBan();
    blist.see();
    blist.jiXunChuBan(3, "c", 59.00);
    blist.see();
    blist.remove2(3);
    blist.see();

}

}

解决方案

把remove2方法改成下面的。遍历list时执行了删除操作不能在进行遍历了。

public void remove2(int bid) {
        for (Book book : bl) {
            if (book.getBid() == bid) {
                bl.remove(book);
                break;
            }
        }
    }

解决方案二:

你线程操作同一个list等时,需要做互斥保护

解决方案三:

 public void remove2(int bid) {
    for (Book book : bl) {
        if (book.getBid()==bid) {
            bl.remove(book);
        }
    }
}
用foreach方式循环遍历删除会报错
用for的方式
for(int i=bl.size()-1;i>=0;i--){
    Book book = (Book)bl.get(i);
    if (book.getBid()==bid) {
            bl.remove(book);
        }
}

解决方案四:

public void remove2(int bid) {
for (Book book : bl) {
if (book.getBid() == bid) {
bl.remove(book);
break;
}
}
}

解决方案五:

《Java并发》:第五节 线程异常处理
java 线程 捕获异常

时间: 2024-08-03 00:46:17

java 线程异常问题 并发性的相关文章

了解Java语言中的并发性和Scala提供的附加选项

本文是一个有关 JVM 并发性的新系列第一篇,将介绍 Java 7 中最新的并发性编程功能,还将介绍一些 Scala 增强.本文还为帮助您理解 Java 8 中的并发性特性扫清了障碍. 处理器速度数十年来一直持续快速发展,并在世纪交替之际走到了终点.从那时起,处理器制造商更多地是通过增加核心来提高芯片性能,而不再通过增加时钟速率来提高芯片性能.多核系统现在成为了从手机到企业服务器等所有设备的标准,而这种趋势可能继续并有所加速.开发人员越来越需要在他们的应用程序代码中支持多个核心,这样才能满足性能

了解Java 8功能如何让并发性编程变得更容易

在期待已久的 Java 8 版本中,并发性方面已实现了许多改进,其中包括在java.util.concurrent 层级中增加新的类和强大的新并行流 功能.设计流的目的是与lambda 表达式 共同使用,Java 8 的这项增强也使得日常编程的其他很多方面变得更加简便.(参见介绍 Java 8 语言的 指南文章,了解对于 lambda 表达式的介绍及相关 interface改动.) 本文首先介绍了新的 CompletableFuture 类如何更好地协调异步操作.接下来,我将介绍如何使用并行流(

Java并发性和多线程介绍

在过去单CPU时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意 义上的"同一时间点",而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运 行. 随着多任务对软件开发者带来的新挑战,程序不在能假设独占所有的CPU时间.所有的内存和其他计算机资源.一个好的程序榜样是在其不再使用这些资源时对其进行释放,以使得其他程序能有机会使用这些资源. 再后来

《Java安全编码标准》一1.7 并发性、可见性和内存

1.7 并发性.可见性和内存 可以在不同线程之间共享的内存称为共享内存(shared memory)或内存堆(heap memory).本节使用变量(variable)这个名词来代表字段和数组元素[JLS2005].在不同的线程中共享的变量称为共享变量.所有的实例字段.静态字段以及数组元素作为共享变量存储在共享内存中.局部变量.形式方法参数以及异常例程参数是从来不能在线程之间共享的,不会受到内存模型的 影响. 在现代多处理器共享内存的架构下,每个处理器有一个或多个层次的缓存,会定期地与主存储器进

JVM 并发性: Java 和 Scala 并发性基础

Java 并发性支持 在 Java 平台诞生之初,并发性支持就是它的一个特性,线程和同步的实现为它提供了超越其他竞争语言的优势.Scala 基于 Java 并在 JVM 上运行,能够直接访问所有 Java 运行时(包括所有并发性支持).所以在分析 Scala 特性之前,我首先会快速回顾一下 Java 语言已经提供的功能. Java 线程基础 在 Java 编程过程中创建和使用线程非常容易.它们由 java.lang.Thread 类表示,线程要执行的代码为 java.lang.Runnable 

推荐阅读Java并发性领域编程最值得一读的力作《JAVA并发编程实践》

我的第一次之给<JAVA并发编程实践>写推荐序英文书名:Java Concurrency in Practice 中文书名:JAVA并发编程实践 这是一本入围17届Jolt大奖的书,虽然最终他没有获奖,但是这只是与政治有关的.:) 推荐序原文如下: http://book.csdn.net/bookfiles/398/10039814644.shtml 在汗牛充栋的 Java 图书堆中,关于并发性的书籍却相当稀少,然而这本书的出现,将极大地弥补了这一方面的空缺.即使并发性编程还没进入到您的 J

《Java线程与并发编程实践》—— 导读

前言 Java线程与并发编程实践 线程和并发工具并非尤物,但是它们是正式应用的重要部分.本书会向你介绍Java 8 Update 60中线程特性以及并发工具的大部分内容. 第1章介绍了类Thread和接口Runnable.你会学习如何创建Thread以及Runnable对象,获取和设置线程状态.启动线程.中断线程,将一条线程插入另外一条线程以及触发线程睡眠. 第2章关注同步.学习后你会解决一些问题,如没有同步就无法解决的竞态条件.你也能学到如何创建同步方法.块,以及如何使用忽略互斥访问的轻量级同

Java并发性和多线程介绍目录

Java并发性和多线程介绍 多线程的优点 多线程的代价 并发编程模型 如何创建并运行java线程 竞态条件与临界区 线程安全与共享资源 线程安全及不可变性 Java内存模型 JAVA同步块 线程通信 Java ThreadLocal Thread Signaling (未翻译) 死锁 避免死锁 饥饿和公平 嵌套管程锁死 Slipped Conditions Java中的锁 Java中的读/写锁 重入锁死 信号量 阻塞队列 线程池 CAS 剖析同步器 无阻塞算法 阿姆达尔定律 文章转自 并发编程网

《 Java并发编程从入门到精通》 Java线程池的监控

本文是< Java并发编程从入门到精通>第9章 线程的监控及其日常工作中如何分析的9.1节 Java线程池的监控.   看不到不等于不存在!让我们来看看工作中是如何找问题解决问题的. 鸟欲高飞先振翅,人求上进先读书. 京东,亚马逊,当当均有销售. 9.1 Java线程池的监控 如果想实现线程池的监控,必须要自定义线程池继承ThreadPoolExecutor类,并且实现beforeExecute,afterExecute和terminated方法,我们可以在任务执行前,执行后和线程池关闭前干一