Java中的线程

今天我在接受采访时询问了Java中的Thread概念? 问题是……

  1. 什么是线程?
  2. 我们为什么要选择线程?
  3. 线程上的实时示例。
  4. 我们可以在Spring框架服务类中创建线程吗?
  5. 可以弯曲调用线程吗?

除了Thread的定义之外,我没有回答任何问题,我也是从互联网上学到的。

任何人都可以清楚地向我解释这个。

更新

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

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

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

public class MyThread extends Thread { String word; public MyThread(String rm){ word = rm; } public void run(){ try { for(;;){ System.out.println(word); 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 

并看到这个:

http://www.javaworld.com/javaworld/jw-04-1996/jw-04-threads.html

对于Spring,您可以使用线程池:

http://static.springsource.org/spring/docs/2.0.x/reference/scheduling.html

multithreading是一种Javafunction,允许并发执行程序的两个或多个部分,以最大限度地利用CPU。 这种程序的每个部分都称为线程。 所以,

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

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

  1. 扩展Thread类
  2. 实现Runnable接口

通过扩展Thread类创建线程

我们创建了一个扩展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(); } } } 

通过实现Runnable接口创建线程

我们创建了一个新类,它实现了java.lang.Runnable接口并覆盖了run()方法。 然后我们实例化一个Thread对象并在该对象上调用start()方法。

 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(); } } } 

线程类与可运行接口

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

  2. 我们可以通过扩展Thread类来实现线程的基本function,因为它提供了一些内置的方法,如yield(),interrupt()等在Runnable接口中不可用。

我可以回答前3个,因为我不太熟悉Spring或Flex的线程function。

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

  2. 您为程序编写multithreading代码以响应用户交互。 想想如果你必须等待浏览器完成下载文件才能继续浏览之前会有多烦人。

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

就Spring而言,是的,你绝对可以创建自己的线程。 但是,最好使用Spring Framework Manual 第25章中描述的线程池支持。

但是,在基于Spring的Web服务(或任何Web服务)中产生请求产生线程会引入您可能想要避免的资源管理问题……

要清理的一个关键概念是,线程是一个OS调度对象,它碰巧有一个代表它的Java类(比如说,Window将在UI子系统中)。 线程本身不是一种类。

Flex无法直接与Java线程通信,无论您使用JMS还是其他什么都必须进行某种消息传递,Flex via BlazeDS,GraniteDS或LCDS可以与JMS通信。 还有一点需要记住的是,目前无论如何,Flash / Flex本身是单线程的,但是高度异步……有些人会说TOO异步……所以任何使用Java线程加速的事情都可能没有你可能希望的效果很好。

看看oracle 教程

  1. 什么是线程?

线程有时被称为轻量级进程。 线程存在于进程中 – 每个进程至少有一个进程。 线程共享进程的资源,包括内存和打开文件。 这使得有效但可能有问题的通信成为可能。

  1. 我们为什么要选择线程?

    1. multithreading执行是Java平台的基本特性。 线程彼此独立。

    2. 您可以通过分解多个子计算来并行化您的计算。

    3. 您可以有效地使用服务器的CPU核心。

    例如

     ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime() .availableProcessors()); 

    如果您在线程之间遵循无共享方法(这是不可能的),multithreading应用程序可提供高吞吐量。

  2. 线程上的实时示例。

    想想WhatsApp类的聊天应用程序。

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

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

Thread类可以实现Runnable或扩展Thread 。 看看oracle教程页面

您可以在Threads中执行业务逻辑。

您可以在Threads中调用不同的类方法。

好的回答简单的单词java中的线程是一个程序/一段代码,它与你的普通类同时工作。 普通类和线程之间的区别在于,线程与普通类并行地同时工作。 在更简单的术语中,让我们看一个示例,其中我当前处于main函数中,并且需要一个函数来计算某些东西。 因此,如果该函数不在一个线程中,那么该函数将首先被评估,之后我将返回main函数,另一方面如果它是一个线程,那么函数将计算,main也将计算其下一条指令。

现在关于如何创建一个线程1.扩展线程类:扩展线程类并编写start()函数使用当前类的对象调用它并编写一个函数即void run()并在此函数中编写代码需要同时进行。

扩展线程的类的每个对象都是一个自定义的线程。默认情况下,每个线程都处于非活动状态,激活或调用该线程只需写入start()这将自动调用包含代码的运行。

 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 } } 
  1. 你也可以实现一个接口,即Runnable ,因为这是一个与当前类兼容的接口,因此调用start将调用函数run() ,该函数在接口中编写但是为了调用我们的run()函数调用start像这样的线程对象Thread t=new thread(this); t.start(); Thread t=new thread(this); t.start();

现在我们为什么要选择线程,这就像问我们为什么选择多核处理器你得到我所说的,multithreading用于同时执行任务

一个实时的例子是服务器任何服务器,考虑Gmail的服务器。如果g邮件服务器没有使用multithreading编写,那么我无法登录而没有你注销,这意味着在全世界只有一个人可以登录有一次你看到它是多么不切实际。

http://learningsolo.com/multithreading/

multithreading是在单个程序中同时执行两个或多个线程的过程。 单核处理器可以一次执行一个线程,但OS使用时间分片function来共享处理器时间。 线程是一个轻量级的过程。 线程存在于进程中,需要较少的资源来创建。 它共享进程资源。 当java应用程序启动时,它会为main创建第一个用户线程,后者又生成多个用户线程和守护进程线程。 线程调度程序调度线程执行。 完成所有线程的工作后,JVM将终止应用程序。

每个java应用程序至少有一个线程 – 主线程。 虽然,有很多其他java线程在后台运行,如内存管理,系统管理,信号处理等。但从应用程序的角度来看 – main是第一个java线程,我们可以从中创建多个线程。