相关疑难解决方法(0)

从多个线程获取java.util.HashMap中的值是否安全(无需修改)?

有一种情况会构建一个地图,一旦它被初始化,它将永远不会被再次修改.但是,它将从多个线程访问(仅通过get(key)).java.util.HashMap以这种方式使用是否安全?

(目前,我很高兴使用a java.util.concurrent.ConcurrentHashMap,并没有明确的需要提高性能,但我只是好奇,如果一个简单HashMap就足够了.因此,这个问题不是 "我应该使用哪一个?"也不是性能问题.相反,问题是"它会安全吗?")

java concurrency multithreading hashmap

135
推荐指数
8
解决办法
6万
查看次数

最好使用HandlerThread而不是其他类似的类

我试图了解使用的最佳用例HandlerThread.

根据定义:

"用于启动具有looper的新线程的方便类.然后可以使用looper来创建处理程序类.请注意,仍然必须调用start()."

我可能是错的,但类似的功能,我可以通过使用实现Thread,LooperHandler.那么我HandlerThread什么时候应该使用?一个例子真的很有帮助.

android android-handler

67
推荐指数
2
解决办法
5万
查看次数

为什么不在构造函数中启动一个线程?如何终止?

我正在学习如何在Java中使用线程.我写了一个实现Runnable的类,它可以并发运行到另一个线程.主线程处理侦听串行端口,而第二个线程将处理将数据发送到同一端口.

public class MyNewThread implements Runnable {
    Thread t;

    MyNewThread() {
        t = new Thread (this, "Data Thread");
        t.start();
    }

    public void run()  {
        // New Thread code here 
    }
Run Code Online (Sandbox Code Playgroud)

第一个线程开始第二个像这样:

public class Main {
    public static void main(String[] args) throws Exception{
        new MyNewThread();
        // First thread code there
    }  
}
Run Code Online (Sandbox Code Playgroud)

这有效,但我的编译器标记了一个警告说:在构造函数中启动一个新线程是危险的.为什么是这样?

这个问题的第二部分是:如果我在一个线程中运行一个循环(串口侦听线程),我在第二个线程中键入一个exit命令.如何获得第一个终止线程?谢谢.

java multithreading terminate

46
推荐指数
2
解决办法
4万
查看次数

Java:在构造函数中启动一个新线程

为什么在Java中(或者就任何地方而言)在构造函数中开始一个新线程.我收到了Netbeans的警告,但它没有给我任何重构建议.我正在编写一个客户端/服务器Swing应用程序,我正在启动的线程是在服务器的JFrame构造函数中,以便持续监听客户端数据报.

为什么这不是好的做法,我应该如何避免呢?

java multithreading

17
推荐指数
1
解决办法
6729
查看次数

为什么我不应该在我的类的构造函数中使用Thread.start()?

我一直在寻找理由,为什么你不应该在类的构造函数中调用线程的start方法.请考虑以下代码:

class SomeClass
{
    public ImportantData data = null;
    public Thread t = null;

    public SomeClass(ImportantData d)
    {
        t = new MyOperationThread();

        // t.start(); // Footnote 1

        data = d;

        t.start();    // Footnote 2
    }
}
Run Code Online (Sandbox Code Playgroud)

ImportantData是一些通用的东西(可能很重要),而MyOperationThread是一个知道如何处理SomeClass实例的线程的子类.

Footnodes:

  1. 我完全理解为什么这是不安全的.如果MyOperationThread在下面的语句完成之前尝试访问SomeClass.data(并且数据被初始化),我将得到一个异常,否则我没有准备好.或许我不会.你不能总是告诉线程.在任何情况下,我都会为以后的奇怪,意外行为做好准备.

  2. 我不明白为什么这样做是禁止的领土.此时,所有SomeClass的成员都已初始化,没有其他成员函数更改状态已被调用,因此构造有效地完成.

根据我的理解,这样做被认为是不好的做法的原因是你可以"泄漏对尚未完全构建的对象的引用".但是对象已经完全构造,构造函数除了返回之外没有什么可做的.我已经搜索了其他问题,寻找这个问题的更具体的答案,并且也查看了引用的材料,但没有找到任何说"你不应该因为这样和那种不良行为",只有"说"你不应该."

如何在构造函数中启动一个线程在概念上与这种情况不同:

class SomeClass
{
    public ImportantData data = null;

    public SomeClass(ImportantData d)
    {
        // OtherClass.someExternalOperation(this); // Not a good idea

        data = d;

        OtherClass.someExternalOperation(this);    // Usually accepted as OK
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,如果课程是最终的怎么办?

final class SomeClass // like this
{ …
Run Code Online (Sandbox Code Playgroud)

java multithreading constructor thread-safety

4
推荐指数
1
解决办法
808
查看次数

从自己的构造函数启动一个线程是一个好主意吗?

我们可以thread_object.start()从同一个对象的构造函数中调用吗?

这种方法是个好主意吗?

java concurrency multithreading

3
推荐指数
1
解决办法
314
查看次数

为什么在构造函数上创建新线程是不好的做法?

可能重复:
Java:为什么不在构造函数中启动一个线程?如何终止?

我习惯在我的代码上运行FindBugs以查找错误或不良做法.今天它抱怨我正在类构造函数中启动一个线程.

真的是坏事吗?你能解释一下为什么吗?

如果我的班级是最终的,那至少是安全的吗?

编辑:

该线程是作为内部类实现的,它只使用在启动时已经初始化的主类的字段:

public final class SingletonOuter {
    private static SingletonOuter ourInstance = new SingletonOuter();

    public static SingletonOuter getInstance() {
        return ourInstance;
    }

    private final SomeOtherClass aField;

    private SingletonOuter() {
        aField=new SomeOtherClass(); 
        thread=new InnerThread();
        thread.start();
    }

    private boolean pleaseStop;

    private synchronized boolean askedStop(){return pleaseStop;}
    public synchronized void stop(){
        pleaseStop=true;  
    }

    private final InnerThread thread ;
    private class InnerThread extends Thread{
        @Override public void run() {
            //do stuff with aField until askedStop()
        }
    } …
Run Code Online (Sandbox Code Playgroud)

java multithreading

2
推荐指数
1
解决办法
3156
查看次数