Java中的线程

Java中的线程,java,multithreading,Java,Multithreading,我今天在一次采访中被问及Java中的线程概念?问题是 什么是线 为什么我们要穿线 线程上的实时示例 我们可以在Spring框架服务类中创建线程吗 flex可以调用线程吗 除了线程的定义,我并没有回答任何问题,这也是我从互联网上学到的 谁能给我解释清楚吗 更新: 线程和普通java类之间的区别是什么。 为什么我们需要线程。。。我可以在线程中执行业务逻辑吗。 我可以在线程中调用不同的类方法吗 我可以回答前3个问题,因为我不太熟悉Spring或Flex的线程功能 线程是一个对象,它有自己的寄存器和堆栈

我今天在一次采访中被问及Java中的线程概念?问题是

  • 什么是线
  • 为什么我们要穿线
  • 线程上的实时示例
  • 我们可以在Spring框架服务类中创建线程吗
  • flex可以调用线程吗
  • 除了线程的定义,我并没有回答任何问题,这也是我从互联网上学到的

    谁能给我解释清楚吗

    更新

    线程和普通java类之间的区别是什么。 为什么我们需要线程。。。我可以在线程中执行业务逻辑吗。
    我可以在线程中调用不同的类方法吗

    我可以回答前3个问题,因为我不太熟悉Spring或Flex的线程功能

  • 线程是一个对象,它有自己的寄存器和堆栈,可以与进程中的其他线程并行运行(进程是线程的集合)

  • 您可以编写多线程代码,使程序对用户交互做出响应。想想看,如果你不得不等到浏览器下载完文件后才能继续浏览,那会有多烦人

  • 我在#2中举了一个例子。其他示例包括任何带有GUI的程序(GUI在执行后台任务时必须始终响应用户输入),或服务器类型的软件,如web服务器,其中您可能需要每分钟响应1000个请求。最好为每个响应都有一个单独的线程


  • 要创建线程,请创建一个扩展
    Thread
    类的新类,并实例化该类。扩展类必须重写
    run
    方法并调用
    start
    方法以开始执行线程

    run
    中,您将定义构成新线程的代码。理解
    run
    可以像主线程一样调用其他方法、使用其他类和声明变量,这一点很重要。唯一的区别是
    run
    为程序中的另一个并发执行线程建立入口点。这将在
    run
    返回时结束

    下面是一个例子:

    public class MyThread extends Thread {
        private final String name;
    
        public MyThread(String name) {
            this.name = name;
        }
    
        public void run() {
            try {
                for (; ; ) {
                    System.out.println(name);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                System.out.println("sleep interrupted");
            }
        }
    
        public static void main(String[] args) {
            Thread t1 = new MyThread("First Thread");
            Thread t2 = new MyThread("Second Thread");
            t1.start();
            t2.start();
        }
    }
    
    您将在屏幕上看到:

    First Thread
    Second Thread
    First Thread
    Second Thread
    First Thread
    

    还解释了
    Runnable
    接口。使用Spring,您可以。

    就Spring而言,您当然可以创建自己的线程。但是最好使用Spring框架手册第1部分中描述的线程池支持


    但是,让请求在基于Spring的web服务(或任何web服务)中生成线程会带来您可能希望避免的资源管理问题…

    需要澄清的一个关键概念是,线程是一个OS调度对象,恰好有一个Java类代表它(例如,UI子系统中的窗口)线程本身不是一种类。

    Flex不能直接与Java线程通信,无论您使用JMS还是其他什么,都必须有某种消息传递,Flex通过BlazeDS、GraniteDS或LCD可以与JMS通信。需要记住的一点是,目前Flash/Flex本身是单线程的,但是高度异步…有些人会说太异步了…因此,任何使用Java线程来加速事情的方法都可能没有你希望的那么大效果。

    多线程是一种Java功能,它允许并发执行程序的两个或多个部分,以最大限度地利用CPU。这样的程序的每个部分都称为线程。因此,

    > 线程是进程中的轻量级进程

    可以使用两种机制创建线程:

  • 扩展线程类
  • 实现可运行接口
  • 通过扩展线程类创建线程

    我们创建了一个扩展
    java.lang.Thread
    类的类。该类重写
    Thread
    类中可用的
    run()
    方法。线程在
    run()
    方法中开始其生命。我们创建了新类的对象并调用
    start()
    方法开始执行线程。
    start()
    调用
    thread
    对象上的
    run()
    方法

    class MultithreadingDemo extends Thread{
    public void run()    {
        try {   // Displaying the thread that is running
            System.out.println ("Thread " + Thread.currentThread().getId() 
                                    + " is running"); 
            }
            catch (Exception e){   // Throwing an exception
                System.out.println ("Exception is caught");
            }
        }
    } 
    public class Multithread{
        public static void main(String[] args)    {
            int n = 8; // Number of threads
            for (int i=0; i<8; i++)        {
                MultithreadingDemo object = new MultithreadingDemo();
                object.start();
            }
        }
    }
    
    线程类与可运行接口

  • 如果我们扩展Thread类,我们的类就不能扩展任何其他类,因为Java不支持多重继承。但是,如果我们实现Runnable接口,我们的类仍然可以扩展其他基类

  • 我们可以通过扩展thread类来实现线程的基本功能,因为它提供了一些内置方法,如yield()、interrupt()等,这些方法在Runnable接口中不可用

  • 看看神谕

  • 什么是线
  • 线程有时被称为轻量级进程。线程存在于一个进程中-每个进程至少有一个线程。线程共享进程的资源,包括内存和打开的文件。这有助于实现高效但可能存在问题的通信

  • 为什么我们要穿线

  • 多线程执行是Java平台的一个基本特性。线程相互独立

  • 您可以通过分解为多个子计算来并行化计算

  • 您可以有效地使用服务器的CPU核心

  • e、 g

    若在线程之间遵循无共享方法(这并不总是可能),多线程应用程序将提供高吞吐量

  • 线程上的实时示例

    想想WhatsApp这类聊天应用程序

    服务器应该在数千个用户之间发送和接收聊天消息。单线程应用程序处理此用例是灾难性的

  • 线程和普通java类之间的区别是什么
    class MultithreadingDemo implements Runnable{
    public void run()    {
        try   {     // Displaying the thread that is running
            System.out.println ("Thread " +  Thread.currentThread().getId() +
                                " is running");
    
        }
        catch (Exception e)   {     // Throwing an exception
            System.out.println ("Exception is caught");
        }
        }
    } 
    class Multithread{
        public static void main(String[] args)    {
            int n = 8; // Number of threads
            for (int i=0; i<8; i++)        {
                Thread object = new Thread(new MultithreadingDemo());
                object.start();
            }
        }
    }
    
    ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
                .availableProcessors());
    
    class MyThreads extends Thread
    {
     int ch ;
    
     MyThreads(int p)
     {
      ch = p;
      start();//statement to activate thread and call run
     }  
    
     public void run()
     {
      if(ch == 1)
        functionx()
      else if(ch == 2)
        functiony();
    
     }
    
     void fx1()
     {
      //parallel running code here
     }
    
     void fx2()
     {
        //parallel running code here
     }
    
     public static void main(String args[])
     {
    
      MyThreads obj1 = new MyThreads(1);
      My3Threads obj2 = new MyThreads(2);
    
      //mains next instruction code here
    
     }
    }