2 miaowei128 miaowei128 于 2015.07.12 08:35 提问

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()+"\t"+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();


}

}

5个回答

tongyi55555
tongyi55555   2015.07.12 09:21

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

public void remove2(int bid) {
        for (Book book : bl) {
            if (book.getBid() == bid) {
                bl.remove(book);
                break;
            }
        }
    }
oyljerry
oyljerry   Ds   Rxr 2015.07.12 11:06

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

danielinbiti
danielinbiti   Ds   Rxr 2015.07.12 12:14
 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);
        }
}
cuiwei1026522829
cuiwei1026522829   Ds   Rxr 2015.07.12 23:29

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

CSDNXIAOD
CSDNXIAOD   2015.07.16 15:23

《Java并发》:第五节 线程异常处理
java 线程 捕获异常
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Java并发性和多线程
一、为什么要使用并发性和多线程 并发性,多个任务同时运行,其实并不是真正的同时,只是CPU不断的切换,使得每个程序都有机会获得一个时间片, 所以感觉是并发执行的。并发可以提高资源的利用率,比如CPU时间、内存以及其他计算机资源。并发可以让我们对不再使用 的资源进行释放,使其他的程序有机会使用这些资源。 多线程,是一个程序内部的细分,一个程序内部有多个线程并行执行,就好像有多个CPU在同时执
python与Java线程实现方式的对比
1. python多线程的实现方式: 继承Thread类 实现Runnable接口 Callable接口+FutureTask包装器来创建Thread线程线程操作涉及到的方法: Thread:start启动 join加入新线程 Lock/Rock:acquire():加锁 release(): 释放锁 Condition:acquire():加锁 release(): 释放锁
Java多线程和并发性知识点总结
一、 什么是进程、线程?线程和进程的区别? 1. 进程 当一个程序进入内存运行时,即变成一个进程。进程是处于运行过程中的程序。 进程是操作系统进行资源分配和调度的一个独立单位。 进程的三个特征: 独立性 独立存在的实体,每个进程都有自己独立私有的一块内存空间。动态性 程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合。并发性 多个进程可在单处理器上并发执行。 并
Java 并发性和多线程
Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程
Java并发性和多线程介绍、优缺点
在过去单核CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。 随着多任务对软件开发者带来的新挑战,程序不在能假设独占所有的CPU时间、所有的内存和其他计算机资源。一个
并发和并行的区别 以及线程的死锁
1 并发的英文是 Concurrency,并行的英文是 Parallel,并发与并行是两个不同的概念。   并行是指在同一时刻,有多条指令在多个处理器上同时执行。 并发是指在同一时刻,只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。  2 线程的死锁     死锁的产生、预防和避免 死锁是由于并发进程只
如何判断 Java 线程并发的安全性
前言 在高并发的时代中,如何写出高质量的并发程序一直是一个令人头疼的事情。现在给你一段代码,你如何判断它是否是线程安全的?又如何改进呢?在这里,我们简单介绍一下Java内部是如果保证线程安全的。一切的关键就在: 高效利用并发,同时也必须保证JMM三大特性的有序性。只有保证了有序性,才能在代码正确执行的前提下去求追更高的效率。而这个王牌就是:先行发生原则 想一想,如果Jav
并发性与并行性 并发性与并行性
Concurrency versus parallelism Concurrency and parallelism are very similar concepts. Different authors give different definitions to these concepts. The most accepted definition talks about concurre
1.5.1 并行性与并发性的区别和联系
并行性和并发性是既相似又有区别的两个概念。并行性是指两个或多个事件在同一时刻发生,并发性是指两个或多个事件在同一时间间隔内发生。 在多道程序环境下,并发性是指在一段时间内,宏观上有多个程序在同时运行,但在单处理器系统中每个时刻却仅有一道程序执行,故微观上这些程序只能分时地交替执行。倘若在计算机系统中有多个处理器,则这些可以并发执行的程序便被分配到多个处理器上,实现并行执行,即利用每个处理器来处理
java 关于System.out.println的多线程并发问题
如果println函数的参数为常量则不会出现线程并发问题,但是如果参数为表达式形式,则JVM在执行println函数的时候会分为几步来执行,从而造成并发问题。 如下例子所示: public class Test { public static void main(String[] args) { ExecutorService pool = Executors.newFixedThre