0

请注意此处显示的代码,其中我在 MsgAndPack 类中声明变量,例如 BufferedOutputStream,然后在一个单独的线程中,在 public void run() 之后,我实例化了这些相同的变量。

这是不好的做法还是这样做有什么隐患?

我应该将这两个东西放在新创建的线程内部或外部的同一个地方吗?

 public class MsgAndPack implements Runnable {

         BufferedInputStream bistr;
         BufferedOutputStream bostr;
         FileInputStream fistr;
         FileOutputStream fostr;
         DataOutputStream dostr;
         long length;

    @Override
    public void run() {

        if (socket.isConnected()) {

            try {
                file = new File("/mnt/sdcard/JIend.db");
                length = file.length();
                byte[] bytes = new byte[(int) length];

                fistr = new FileInputStream(file);
                bistr = new BufferedInputStream(fistr);
                bostr = new BufferedOutputStream(socket.getOutputStream());
                dostr = new DataOutputStream(bostr); 
                int count;
4

1 回答 1

3

首先,没有像“声明变量的线程”这样的东西。实例化和访问很重要,而不是声明位置 - 没有仅用于声明的代码。

如果您在 run 中实例化这些变量并仅在 run 中使用它们,为什么不在 run 中也声明它们呢?那将是最简单和最安全的解决方案。

在类级别声明它们表明您将通过一种以上的方法访问它们。如果您不需要它,那么阅读代码的人都会感到困惑。

此外,您将它们声明为包本地,这表明该类之外的某些东西可以访问它们。这是不安全的——这意味着它们可以被多个线程共享,这会带来很多麻烦,因为流是有状态的并且不是线程安全的。

所以总结一下 - 只要您在一个线程中初始化和引用它们,在类级别声明这些流本身并没有错,但它非常脆弱。在一个线程中初始化并在另一个线程中访问至少需要使它们变得易失(另一个线程可能无法获得值更新)。因此,请始终使用尽可能小的范围。

如果您的意图在线程之间共享某些字段,请确保对它们的访问是正确同步的(同步的、易失的),或者它们本身是线程安全的。

于 2013-09-20T07:40:11.690 回答