线程与流的区别。

3

最近我开始学习Java,对于IO流和线程有一个问题。在我们的语言中,这两个定义都被翻译成“Поток”,这让我感到困惑。

我想了解这两个主题的概念:流和线程。我会提供一个例子来展示我的观点。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {
    public static void main(String[] args) {
        try{
            FileOutputStream fos = new FileOutputStream("C:\\Users\\TMS\\Desktop\\Workspace\\src\\File.txt");
            FileInputStream fis =  new FileInputStream("C:\\Users\\TMS\\Desktop\\Workspace\\src\\FileWithInfo");
            int supnum = 0;
            try{
                while((supnum = fis.read()) != -1){
                    fos.write(supnum);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (IOException e){
            e.printStackTrace();
        }

    }
}

据我理解,我创建了两个类的实例:FileOutputStream 和 FileInputStream。这些类的实例可以作为“控制器”,帮助我们通过提供方法(例如.write 和 .read)来控制流,并且同时隐式地让Java与处理器交互,告诉处理器创建新的流(我不确定,但如果我们创建大量的流,可能会在任务管理器中看到它们)。
因此,最终我们拥有一个链:
1. 帮助我们控制流的类的实例。 2. 我们用于传输数据的流。 3. 我们用于读取或写入信息的文件。
如果我们谈论线程,这个链几乎是相同的:
public class Program {
      
    public static void main(String[] args) {
          
        System.out.println("Main thread started...");
        Runnable r = ()->{
            System.out.printf("%s started... \n", Thread.currentThread().getName());
            try{
                Thread.sleep(500);
            }
            catch(InterruptedException e){
                System.out.println("Thread has been interrupted");
            }
            System.out.printf("%s finished... \n", Thread.currentThread().getName());
        };
        Thread myThread = new Thread(r,"MyThread");
        myThread.start();
        System.out.println("Main thread finished...");
    }
}

我们有一个实例(myThread),它帮助我们使用方法来控制线程。

我所看到的区别是,流只能用于数据传输,而线程是一个更复杂的工具,允许我们将它们用作额外的.main(String [] args)方法。

我想知道:

  1. 我的猜测正确吗?

    • 如果不是,这些术语之间的区别是什么?
  2. 为什么与IO相关的类不像Thread类一样实现Runnable接口?

  3. 我们可以像使用流一样使用线程传输数据吗?


1
线程和流是完全正交的概念。这就像询问蓝色与披萨之间的区别一样。 - Mark Rotteveel
流更专注于数据,换句话说,流是一系列内存块的序列,读取仅限于单个方向,虽然可以实现并行流,但其思想相同...块的顺序和顺序保持不变,无法读取已访问的位置,而线程则较少耦合内存,它可以锁定部分内存以多次写入或读取,并且它们不保证调用顺序。与IO相关的实现受限于操作系统,文件锁定由程序本身提供以执行系统调用。 - SaleemKhair
2个回答

6

很不幸,这些术语在你的语言中翻译成了相同的东西,而它们实际上是完全不同的概念。

流控制数据流。在你的例子中,这是从文件出入流的数据流,但你也可以用它们做其他事情。在这里可以看到所有的inputstream的子类:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/InputStream.html

线程控制指令流。在你的例子中,你延迟了半秒钟的指令。使用线程控制指令最有价值的部分就是能够创建多个线程,这可以让两个指令流同时执行。多线程/并行运算的概念对于一个单一的stackoverflow答案来说有点深奥。如果你想获取更多关于多线程的信息,网络上有很多资源可供参考。我强烈推荐阅读相关主题,因为当手动实现多线程时会出现许多许多问题。


1
有趣的一点是:在俄语中,描述这两个概念的术语是不同的。 流(Stream)确实是“Поток”,而线程(Thread)实际上被称为“Нить”。
然而,在俄罗斯编程传统中,这两个概念之间确实会产生混淆,因为多线程被翻译为“многопоточность”,字面意思是“多流”或“多并发”。
我不知道为什么俄语中会出现这样的混淆(也许是因为一些“有创意”的翻译家认为,想出一个更具诗意的术语比直译术语更好)。
我个人会直译“multithreading”,说类似“многонитевость”的话,但很多人会持不同意见(我猜有些人喜欢守门把新手搞糊涂的晦涩术语)。
这就是为什么我首先尝试依赖英文文档,并且只有在阅读俄语或西班牙语文档时才开始查看,因为有很多这样的小差异。例如,西班牙语使用者会将数组称为“Arreglo”,列表称为“Lista”,但“ArrayList”会发音为“Arrai List”,而不是“Arreglo Lista”。
无论如何,线程和IO流之间是有区别的。 线程允许使用并发编程,而IO流只是一种显示信息来自何处以及将其发送到何处的方式。
例如,用眼睛阅读是一个输入流,你的大脑处理信息是一个线程,你说话是一个输出流。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接