用java编写一个多线程

时间: 2023-09-15 09:05:46 浏览: 58
### 回答1: 要使用 Java 编写一个多线程程序,你可以使用以下方法之一: 1. 继承 java.lang.Thread 类:可以创建一个继承 Thread 类的新类,并重写该类的 run() 方法。然后,可以创建该类的实例,并调用它的 start() 方法来启动线程。 ``` class MyThread extends Thread { public void run() { // your code here } } // To start a thread, you create an instance of the class and call its start() method MyThread myThread = new MyThread(); myThread.start(); ``` 2. 实现 java.lang.Runnable 接口:可以创建一个实现了 Runnable 接口的类,并重写该接口的 run() 方法。然后,可以创建一个 Thread 实例,并将该 Runnable 实例作为参数传递给该 Thread 实例。最后,可以调用 start() 方法启动线程。 ``` class MyRunnable implements Runnable { public void run() { // your code here } } // To start a thread, you create an instance of the Thread class and pass a Runnable instance to its constructor MyRunnable myRunnable = new MyRunnable(); Thread myThread = new Thread(myRunnable); myThread.start(); ``` ### 回答2: 使用Java编写多线程可以通过继承Thread类或实现Runnable接口来实现。 1. 继承Thread类: ```java public class MyThread extends Thread { public void run() { // 线程执行的逻辑 } } public class Main { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); // 启动线程 } } ``` 2. 实现Runnable接口: ```java public class MyRunnable implements Runnable { public void run() { // 线程执行的逻辑 } } public class Main { public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thread.start(); // 启动线程 } } ``` 在多线程中,可以同时执行多个线程,每个线程独立执行自己的任务。可以使用Thread类的start()方法启动线程,线程在运行时调用run()方法执行具体的逻辑。 多线程编程的好处是可以提高程序的效率和响应速度。通过合理地使用多线程,可以利用多核处理器并行处理任务,提升系统的整体性能。 但是多线程编程也需要注意线程安全的问题,如通过使用synchronized关键字或锁机制来保证共享资源的正确访问,避免数据竞争等问题。另外还需注意资源的释放和线程的生命周期管理,以避免内存泄漏和僵尸线程等问题。 ### 回答3: 使用Java编写多线程的方法有多种,以下是一个示例: ```java public class MultiThreadExample { public static void main(String[] args) { // 创建并启动线程 MyThread thread1 = new MyThread("线程1"); MyThread thread2 = new MyThread("线程2"); thread1.start(); thread2.start(); } static class MyThread extends Thread { private String name; public MyThread(String name) { this.name = name; } @Override public void run() { for (int i = 1; i <= 10; i++) { System.out.println(name + ": " + i); try { Thread.sleep(1000); // 暂停1秒 } catch (InterruptedException e) { e.printStackTrace(); } } } } } ``` 上述示例中,我们创建了一个名为`MyThread`的自定义线程类,它继承自`Thread`类。在`run`方法中,我们循环输出当前线程的名称和计数器的值,并通过`Thread.sleep()`暂停1秒。在`main`方法中,我们创建了两个`MyThread`对象,并分别启动了它们。 运行该代码,输出类似于以下内容的结果: ``` 线程1: 1 线程2: 1 线程2: 2 线程1: 2 线程1: 3 线程2: 3 ... ``` 这个例子展示了如何使用Java编写多线程。通过继承`Thread`类并重写`run`方法,我们可以创建自定义的线程逻辑。每个线程都独立运行,并且可以并发地执行不同的任务。

相关推荐

### 回答1: 在Java中实现多线程并发可以使用Thread类或Executor框架。 以下是使用Thread类的示例: public class MyThread extends Thread { @Override public void run() { // 执行线程任务 } } public class Main { public static void main(String[] args) { MyThread thread1 = new MyThread(); MyThread thread2 = new MyThread(); // 启动线程 thread1.start(); thread2.start(); } } 以下是使用Executor框架的示例: import java.util.concurrent.Executor; import java.util.concurrent.Executors; public class Main { public static void main(String[] args) { Executor executor = Executors.newFixedThreadPool(2); Runnable task1 = new Runnable() { @Override public void run() { // 执行线程任务1 } }; Runnable task2 = new Runnable() { @Override public void run() { // 执行线程任务2 } }; // 启动线程 executor.execute(task1); executor.execute(task2); } } ### 回答2: 在Java中,通过使用多线程可以实现并发操作。下面是一个用Java编写的多线程并发的示例: java public class MultiThreadExample { public static void main(String[] args) { // 创建并启动多个线程 Thread thread1 = new MyThread("Thread 1"); Thread thread2 = new MyThread("Thread 2"); Thread thread3 = new MyThread("Thread 3"); thread1.start(); thread2.start(); thread3.start(); } static class MyThread extends Thread { private String name; public MyThread(String name) { this.name = name; } @Override public void run() { // 线程需要执行的任务 for (int i = 1; i <= 5; i++) { System.out.println(name + " 执行第 " + i + " 步"); // 睡眠一段时间模拟执行过程中的耗时操作 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } } } 上述示例中,创建了三个自定义线程MyThread的实例,并分别传递了不同的名称。然后,通过调用start()方法来启动线程。 每个线程在run()方法中通过使用for循环模拟了执行5个步骤的操作。在每个步骤中,线程会打印出其名称和步骤数,并且在每次步骤之间会暂停500毫秒以模拟耗时操作。 由于多个线程同时执行,所以它们会并发地执行各自的任务,从而实现了多线程的并发操作。 ### 回答3: 在Java中,可以使用多种方式实现多线程并发。以下是一种常见的方法: 首先,需要定义一个类来表示线程。这个类必须继承Thread类,并实现其run方法。在run方法中,可以编写需要线程执行的代码。 接下来,可以创建多个线程的实例,并调用它们的start方法,以启动线程。每个线程将执行自己定义的run方法中的代码。 在多线程并发中,需要特别注意的是共享资源的并发访问。由于多个线程可能同时访问共享资源,如果不进行合理的同步控制,可能会导致数据出错或死锁等问题。 为了避免这种情况,可以使用Java提供的synchronized关键字来实现同步。对于需要同步访问的代码块,可以使用synchronized关键字来修饰,确保同时只有一个线程能够执行此代码块。 此外,也可以使用Lock和Condition等Java中提供的同步工具类来实现更为灵活和精确的同步控制。 总结来说,编写一个多线程并发程序的基本步骤为:定义线程类,实现run方法,创建线程实例并启动,合理进行同步控制。通过这些步骤,可以实现多线程的并发执行,充分发挥计算资源的利用率,提高程序的执行效率。
好的,这是一个很有趣的问题。我可以为您提供以下的Java代码: java public class Race { public static void main(String[] args) { Tortoise tortoise = new Tortoise(); Hare hare = new Hare(); // 启动线程 tortoise.start(); hare.start(); // 等待线程结束 try { tortoise.join(); hare.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } class Tortoise extends Thread { @Override public void run() { for (int i = 1; i <= 100; i++) { System.out.println("乌龟跑了 " + i + " 步"); // 休眠一段时间 try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("乌龟到达终点!"); } } class Hare extends Thread { @Override public void run() { for (int i = 1; i <= 100; i++) { System.out.println("兔子跑了 " + i + " 步"); // 睡觉一段时间 if (i % 10 == 0) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } System.out.println("兔子到达终点!"); } } 在这个代码中,我们先定义了两个类,Tortoise表示乌龟,Hare表示兔子,每个类都继承了Thread类,这样我们就可以通过多线程来模拟赛跑了。 在main方法中,我们首先创建了乌龟和兔子的对象,然后启动了它们的线程,最后等待线程结束。 Tortoise和Hare类的run方法中,我们都使用了一个循环来模拟跑步,当然,兔子和乌龟的速度不一样,我们就用Thread.sleep方法来让它们在跑步的过程中休息一段时间。 最后,当某一方跑完100步后,就输出该选手已经到达终点了。 我希望这段代码可以帮到您。
好的,以下是一个简单的Java多线程小应用程序,模拟小球碰壁反弹的效果: java import java.awt.Color; import java.awt.Graphics; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; public class BallGame extends JPanel implements Runnable { private static final long serialVersionUID = 1L; private int x = 0; //小球的横坐标 private int y = 0; //小球的纵坐标 private int xSpeed = 5; //小球的横向速度 private int ySpeed = 5; //小球的纵向速度 private int ballSize = 50; //小球的大小 public static void main(String[] args) { JFrame frame = new JFrame("Ball Game"); //创建窗口对象 frame.setSize(500, 500); //设置窗口大小 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置窗口关闭操作 BallGame ballGame = new BallGame(); //创建游戏面板对象 frame.add(ballGame); //将游戏面板添加到窗口中 frame.setVisible(true); //设置窗口可见 Thread thread = new Thread(ballGame); //创建线程对象 thread.start(); //启动线程 } public void paint(Graphics g) { super.paint(g); //调用父类的方法 g.setColor(Color.RED); //设置画笔颜色 g.fillOval(x, y, ballSize, ballSize); //画出小球 } public void run() { while (true) { x += xSpeed; //更新小球的横坐标 y += ySpeed; //更新小球的纵坐标 if (x + ballSize >= getWidth() || x <= 0) { //判断小球是否碰到左右边界 xSpeed = -xSpeed; //小球反弹 } if (y + ballSize >= getHeight() || y <= 0) { //判断小球是否碰到上下边界 ySpeed = -ySpeed; //小球反弹 } repaint(); //重新绘制面板 try { Thread.sleep(50); //线程休眠50毫秒 } catch (InterruptedException e) { e.printStackTrace(); } } } } 这个程序使用了Java的多线程技术,通过不断更新小球的坐标来模拟小球碰壁反弹的效果。运行程序后,会出现一个窗口,里面有一个红色的小球在不断移动。当小球碰到窗口的边界时,就会反弹。
好的,下面是一个简单的多线程模拟叫号系统的Java代码: java import java.util.LinkedList; import java.util.Queue; public class CallNumberSystem { private static final int MAX_NUMBER = 100; // 最大号码 private static final int WINDOW_COUNT = 3; // 窗口数量 private static final int CUSTOMER_COUNT = 50; // 客户数量 private static Queue<Integer> queue = new LinkedList<>(); // 号码队列 public static void main(String[] args) { // 初始化号码队列 for (int i = 1; i <= MAX_NUMBER; i++) { queue.offer(i); } // 开启多个窗口 for (int i = 1; i <= WINDOW_COUNT; i++) { new Thread(new Window(i)).start(); } } // 窗口类 private static class Window implements Runnable { private int id; // 窗口编号 public Window(int id) { this.id = id; } @Override public void run() { while (true) { synchronized (queue) { // 同步队列 if (queue.isEmpty()) { // 队列为空,结束服务 break; } int number = queue.poll(); // 取出一个号码 System.out.printf("窗口%d号正在为第%d位客户办理业务\n", id, number); try { Thread.sleep((long) (Math.random() * 5000)); // 模拟办理业务的时间 } catch (InterruptedException e) { e.printStackTrace(); } } } } } } 以上代码中,我们创建了一个CallNumberSystem类来启动整个程序,其中定义了三个常量:MAX_NUMBER表示最大号码,WINDOW_COUNT表示窗口数量,CUSTOMER_COUNT表示客户数量。我们使用LinkedList作为队列来存储号码,然后在main方法中初始化队列,并启动多个窗口线程。每个窗口线程通过synchronized来同步访问队列,判断队列是否为空,如果不为空就取出一个号码,打印出当前窗口正在为第几位客户办理业务,并且模拟一段时间的办理业务时间,然后再次进入循环。当队列为空时,窗口线程结束服务。这样就实现了一个简单的多线程模拟叫号系统。
### 回答1: 很高兴回答你的问题,Java语言可以用来编写一个单部多线程傻瓜调度(FAFS)电梯系统。要实现这个系统,你需要使用Java线程来模拟单部多线程傻瓜调度(FAFS)电梯系统,并使用多线程技术来实现调度算法。此外,你还需要使用Java GUI技术来实现电梯系统的图形界面。 ### 回答2: 单部多线程傻瓜调度(FAFS)电梯系统是一个用Java编写的电梯调度系统,它能够同时工作于多个线程,并且是一个简单的调度算法。 该系统的主要功能是通过多线程实现电梯调度和乘客楼层请求的处理。以下是该系统的基本设计思路: 1. 创建电梯类(Elevator)和乘客类(Passenger),其中电梯类包含电梯的状态、当前楼层、电梯移动方向等信息,乘客类包含乘客的楼层请求信息。 2. 创建调度器类(Scheduler),用于管理所有的电梯和乘客请求。调度器继承自Thread类,可以单独运行一个线程,处理所有的电梯和乘客请求。 3. 在调度器类中,根据乘客请求,将乘客分配给电梯。调度器使用傻瓜调度算法,即每当有新的请求时,将乘客分配给最近的电梯。 4. 电梯类中的run()方法中,通过循环检查当前电梯的状态和楼层。根据电梯的移动方向以及当前楼层,决定是否停靠乘客所请求的楼层,并更新电梯的状态。 5. 在调度器类中,监听乘客类的请求,并根据乘客请求创建新的乘客对象,并将其分配给电梯。每当有新的乘客请求时,调度器会在电梯中选择最适合的电梯。 6. 调度器和电梯类之间通过线程间通信进行交互,当电梯到达某一楼层时,调度器会通知乘客类,并更新乘客的状态和楼层信息。 以上是用Java编写单部多线程傻瓜调度(FAFS)电梯系统的基本思路,通过多线程实现电梯调度和乘客请求的处理,以实现高效的电梯调度。 ### 回答3: FAFS电梯系统是一种单部多线程的电梯调度系统,使用Java编写。该系统基于先来先服务(First Come First Serve)算法,主要模拟电梯的调度和运行过程。 电梯系统主要由以下几个类组成: 1. 电梯类(Elevator):表示电梯对象。该类包含电梯的当前楼层、运行方向、状态等信息,以及对电梯进行运行、停止、开关门等操作的方法。 2. 乘客类(Passenger):表示乘客对象。每个乘客对象包含起始楼层和目标楼层等信息。 3.调度器类(Scheduler):负责协调电梯和乘客之间的调度。对于每个请求,调度器根据乘客的楼层请求选择一个最近的空闲电梯,并将乘客请求加入到该电梯的请求队列中。 4. 请求类(Request):表示乘客对电梯系统发出的请求。该类包含乘客的起始楼层和目标楼层等信息。 在FAFS电梯系统中,每当有乘客发出请求时,调度器将该请求分配给最近空闲的电梯。电梯根据当前楼层和运行方向来决定是否响应该请求,并根据乘客请求的楼层顺序来按序处理请求。 电梯通过多线程来实现。每个电梯对象都运行在独立的线程中,通过循环监听调度器传递过来的请求队列。电梯通过判断当前楼层与请求队列中的楼层差值来判断响应该请求。一旦响应请求,电梯将执行相应操作,如开关门、运行、停止,并更新当前楼层和运行方向。 整个系统的运行过程是在调度器的主线程中启动的。调度器通过循环监听乘客的请求,并将请求分配给最近的空闲电梯。每个电梯通过独立的线程运行,并通过调度器的请求队列来处理乘客的请求。 FAFS电梯系统利用多线程实现了电梯的并行处理,使得乘客的请求可以被快速响应并处理。电梯系统能够提供高效的乘坐体验,减少乘客的等待时间,提高电梯的运行效率。
### 回答1: 下面是一个 VB6 多线程代码样例: Private Sub Form_Load() Dim Thread1 As New Thread Set Thread1 = New Thread Thread1.ThreadID = 1 Thread1.Run End Sub Private Sub Class_Initialize() Dim Thread2 As New Thread Set Thread2 = New Thread Thread2.ThreadID = 2 Thread2.Run End Sub Private Sub Thread_Run() Dim i As Long For i = 1 To 100 Debug.Print "Thread " & ThreadID & ": " & i Sleep 1000 Next End Sub 这是一个简单的 VB6 多线程程序,它创建了两个线程:一个在 Form_Load 事件中创建,另一个在类的初始化中创建。每个线程都在循环中输出其 ThreadID 和循环计数器的值,并在每次循环之间使用 Sleep 函数暂停一秒。 请注意,由于 VB6 不支持原生多线程,因此上述代码使用类来实现多线程。 ### 回答2: 在VB6中,虽然不支持直接的多线程编程,但可以通过API函数来实现多线程的功能。下面是一个使用VB6编写的多线程代码示例: 首先,在VB6中创建一个新的标准EXE项目。然后在Form1的代码模块中添加以下代码: vb Option Explicit Private Declare Function CreateThread Lib "kernel32" ( _ ByVal lpThreadAttributes As Long, _ ByVal dwStackSize As Long, _ ByVal lpStartAddress As Long, _ ByVal lpParameter As Long, _ ByVal dwCreationFlags As Long, _ lpThreadId As Long) As Long Private Declare Function WaitForSingleObject Lib "kernel32" ( _ ByVal hHandle As Long, _ ByVal dwMilliseconds As Long) As Long Private Sub Form_Load() Dim hThread As Long Dim dwThreadId As Long ' 创建一个新线程 hThread = CreateThread(ByVal 0&, 0&, AddressOf ThreadProc, ByVal 0&, 0&, dwThreadId) ' 等待线程结束 WaitForSingleObject hThread, INFINITE ' 关闭线程句柄 CloseHandle hThread ' 显示线程结束提示 MsgBox "线程结束" End Sub Private Sub ThreadProc() ' 在这里编写多线程的代码逻辑 MsgBox "多线程执行" End Sub 在上面的例子中,我们使用了CreateThread和WaitForSingleObject两个API函数来创建和控制线程。在Form_Load事件中,我们通过调用CreateThread函数创建了一个新的线程,并将线程函数指定为ThreadProc。然后使用WaitForSingleObject函数等待线程结束,保证线程的完整执行。最后,我们通过CloseHandle函数关闭线程句柄,清理资源。在ThreadProc函数中,我们可以编写我们需要在新线程中执行的任何代码逻辑。 需要注意的是,由于VB6的单线程限制,无法直接从新线程中访问窗体上的控件,如果需要更新界面的话,可以使用回调函数的方式来通知主线程进行更新。 虽然VB6不是推荐用于多线程编程,但通过API的帮助,我们可以实现简单的多线程功能。 ### 回答3: VB6是一门过时的编程语言,不支持多线程编程。然而,我们可以通过使用ActiveX组件来实现多线程行为。下面是一个简单的VB6多线程代码样例: 首先,我们需要创建一个ActiveX DLL项目。打开VB6,并选择“ActiveX DLL”模板,命名为“MultiThreadDLL”。 在Class1模块中,添加以下代码: vb Option Explicit Public Event ThreadCompleted(ByVal result As String) Public Sub StartThread() Dim t As ThreadClass Set t = New ThreadClass Set t.Parent = Me t.StartThread End Sub Public Sub OnThreadCompleted(result As String) RaiseEvent ThreadCompleted(result) End Sub 然后,添加一个标准模块。在模块中添加以下代码: vb Option Explicit Dim WithEvents mt As New MultiThreadDLL.Class1 Private Sub mt_ThreadCompleted(ByVal result As String) MsgBox "线程执行完毕,结果为:" & result End Sub Sub StartMultiThread() mt.StartThread End Sub 最后,我们需要创建一个Class模块,命名为“ThreadClass”。在Class模块中添加以下代码: vb Option Explicit Public Parent As MultiThreadDLL.Class1 Public Sub StartThread() Dim t As ThreadClass Set t = New ThreadClass t.Parent = Me.Parent Dim result As String '模拟耗时操作 For i = 1 To 100000000 result = result & i Next i Me.Parent.OnThreadCompleted result End Sub 现在,我们可以在标准模块中调用StartMultiThread过程来启动多线程。当线程执行完毕时,会弹出一个消息框显示结果。 需要注意的是,由于VB6不是原生支持多线程编程,所以它的多线程实现仅仅是通过使用ActiveX组件来模拟实现的,并不是真正的多线程。在实际开发中,建议使用支持多线程的现代编程语言,如C#或Java。

最新推荐

多线程设计一个火车售票模拟程序

java通过并发进程实现火车自动售票程序,假如火车站有100张火车票要卖出去,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况。

Python在线考试系统前端-大学毕业设计-基于vue.zip

Python在线考试系统前端-大学毕业设计-基于vue

Python各种图像注意力模块的实现.zip

注意力机制

300161华中数控财务报告资产负债利润现金流量表企业治理结构股票交易研发创新等1391个指标(2007-2022).xlsx

包含1391个指标,其说明文档参考: https://blog.csdn.net/yushibing717/article/details/136115027 数据来源:基于上市公司公告数据整理 数据期间:从具体上市公司上市那一年开始-2022年度的数据,年度数据 包含各上市公司股票的、多年度的上市公司财务报表资产负债表、上市公司财务报表利润表、上市公司财务报表现金流量表间接法、直接法四表合在一个面板里面,方便比较和分析利用 含各个上市公司股票的、多年度的 偿债能力 披露财务指标 比率结构 经营能力 盈利能力 现金流量分析 风险水平 发展能力 每股指标 相对价值指标 股利分配 11类财务指标分析数据合在一个面板里面,方便比较和分析利用 含上市公司公告的公司治理、股权结构、审计、诉讼等数据 包含1391个指标,如: 股票简称 证券ID 注册具体地址 公司办公地址 办公地址邮政编码 董事会秘书 董秘联系电话 董秘传真 董秘电子邮箱 ..... 货币资金 其中:客户资金存款 结算备付金 其中:客户备付金 .........

DAC简介及参考电路PPT学习教案.pptx

DAC简介及参考电路PPT学习教案.pptx

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

OceanBase数据库简介及原理解析

# 1. OceanBase数据库概述 ## 1.1 OceanBase数据库的发展历程 OceanBase数据库是由阿里巴巴集团自主研发的一款分布式关系型数据库系统,起源于阿里集团的业务需求和技术挑战。自2010年开始研发,经过多年的迭代和优化,OceanBase已经成为阿里巴巴集团重要的核心数据库产品之一。在实际的业务场景中,OceanBase已经被广泛应用于金融、电商、物流等各个领域。 ## 1.2 OceanBase数据库的特点和优势 OceanBase数据库具有以下特点和优势: - **分布式架构**:OceanBase采用多副本分布式架构,可以实现高可用和数据容灾。 -

python的pandas读取excel怎么将excel表里的列从1开始而不是0

在 Pandas 中,数据框的列默认从0开始编号,但我们可以通过自定义函数来进行数据列的转换。可以先将读取的数据框列的第一个值设为1,然后对后续列进行递增处理。 以下是示例代码: ```python import pandas as pd # 读取 Excel 文件 df = pd.read_excel('your_excel_file.xlsx') # 定义函数将列从1开始 def reset_column(x): return str(int(x) + 1) # 应用函数到所有列名 df = df.rename(columns=reset_column) # 打印数据框

第三章薪酬水平、薪酬系统的运行与控制.pptx

第三章薪酬水平、薪酬系统的运行与控制.pptx

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依