精华内容
下载资源
问答
  • 多线程应用,在实际的项目或产品开发中,原则上来说,应该尽量避免,但是在强调用户体验的要求下或开发平台的限制下(如 Silverlight Socket 通讯),我们不得不用多线程
  • 多线程异常处理

    千次阅读 2018-07-07 22:26:49
    1. 简述并区分程序、...一个进程在其执行过程中,可以产生线程,形成条执行线索。每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。一个线程有它自己的入口和出口,以及一个顺序执行的序...

    1. 简述并区分程序、进程和线程三个概念。

        程序是为完成特定任务、用某种语言编写的一组指令的集合。指一段静态的代码。

    进程是程序的一次执行过程,是系统进行调度和资源分配的一个独立单位。

        线程是比进程更小的执行单位。一个进程在其执行过程中,可以产生多个线程,形成多条执行线索。每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。一个线程有它自己的入口和出口,以及一个顺序执行的序列线程不能独立存在,必须存在于进程中。

    2. 线程有哪几个基本的状态?Java中线程调度遵循何种原则?

       答:线程与进程都是顺序执行的指令序列,但线程和进程不同。对于进程来说,子进程与父进程有不同的代码和数据空间;但是多个线程则共享数据空间,每个线程都有自己的执行堆栈和程序计数器作为其执行的上下文。线程的基本状态有新建、就绪、运行、阻塞、死亡。线程调度安照线程的优先级来调度线程的执行,具有高优先级的线程会在较低优先级的线程之前得到执行。同时线程的调度是抢先式的。

    3. 实现多线程可以用哪两种基本方法?将这两种方法进行比较。

    答:第一种方法是通过实现Runnable接口实现,第二种方法是通过继承Thread类,

    使用Runnable方式可以实现两条线程交替运行(注:不是绝对的交替),而用Thread无法实现

    4. 异常是如何抛出、捕捉和处理的?

    答:在可能会出现exception的地方,要使用try-catch或者throws或者两者都要。我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-catch掉这个exception;如果希望外部知道,则在catch到之后把exception直接抛出或者抛出自定义的exception。  

        处理意外的一个重要原则,就是要么处理,要么接着抛,决不能吃掉(You either handle it, or throw it. You don’t eat it.)这就是说,当你捕获一个异常之后,必须决定是否立即处理这个异常,或者继续抛出这个异常(或者另一个自定义异常),以便由调用的客户端捕获之。当客户端捕获到以后,又会继续进行类似的判断。

    5. 异常处理机制有哪些好处

        答:第一,当发生错误时,程序不至于崩溃。

    第二,当发生错误时,可以在短时间内找到错误所在行,能节省时间。

     


    展开全文
  • [size=14.399999618530273px]在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉。这一点是通过java.lang.Runnable.run()方法声明(因为...
    如果各位觉得对自己有用,就支持一下吧
    
    

    [size=14.399999618530273px]在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉。这一点是通过java.lang.Runnable.run()方法声明(因为此方法声明上没有throw exception部分)进行了约束。但是线程依然有可能抛出unchecked exception,当此类异常跑抛出时,线程就会终结,而对于主线程和其他线程完全不受影响,且完全感知不到某个线程抛出的异常(也是说完全无法catch到这个异常)。JVM的这种设计源自于这样一种理念:“线程是独立执行的代码片断,线程的问题应该由线程自己来解决,而不要委托到外部。”基于这样的设计理念,在Java中,线程方法的异常(无论是checked还是unchecked exception),都应该在线程代码边界之内(run方法内)进行try catch并处理掉.


    [size=14.399999618530273px]但如果线程确实没有自己try catch某个unchecked exception,而我们又想在线程代码边界之外(run方法之外)来捕获和处理这个异常的话,java为我们提供了一种线程内发生异常时能够在线程代码边界之外处理异常的回调机制,即Thread对象提供的setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法。

    [size=14.399999618530273px]通过该方法给某个thread设置一个UncaughtExceptionHandler,可以确保在该线程出现异常时能通过回调UncaughtExceptionHandler接口的public void uncaughtException(Thread t, Throwable e) 方法来处理异常,这样的好处或者说目的是可以在线程代码边界之外(Thread的run()方法之外),有一个地方能处理未捕获异常。但是要特别明确的是:虽然是在回调方法中处理异常,但这个回调方法在执行时依然还在抛出异常的这个线程中!另外还要特别说明一点:如果线程是通过线程池创建,线程异常发生时UncaughtExceptionHandler接口不一定会立即回调。


    [size=14.399999618530273px]比之上述方法,还有一种编程上的处理方式可以借鉴,即,有时候主线程的调用方可能只是想知道子线程执行过程中发生过哪些异常,而不一定会处理或是立即处理,那么发起子线程的方法可以把子线程抛出的异常实例收集起来作为一个Exception的List返回给调用方,由调用方来根据异常情况决定如何应对。不过要特别注意的是,此时子线程早以终结。
    展开全文
  • java实验之多线程异常处理

    千次阅读 2018-10-11 22:46:50
    掌握异常的概念以及如何定义、抛出和捕捉处理异常。    二、实验环境:   一台配置有java环境,装有eclipse的电脑。   三、实验内容: (写出主要的内容) (一) 实验要求 掌握利用Java语言编写多线程...
    • 实验目的:

     

    了解线程的概念、线程的生命周期,掌握多线程的编程。掌握异常的概念以及如何定义、抛出和捕捉处理异常。 

     

    二、实验环境:

     

    一台配置有java环境,装有eclipse的电脑。

     

    三、实验内容:

    (写出主要的内容)

    (一) 实验要求

    1. 掌握利用Java语言编写多线程程序的方法
    2. 掌握线程的调度方法
    3. 编写一个程序,用来捕获各种类型的异常
    4. 编写一个程序,用来说明异常处理块中各个语句块的作用
    5. 熟悉异常的类型及其产生的原因

    (二) Thread子类的方法实现多线程

    1. 编写 TwoThreadsTest.java 程序文件,源代码如下。

    class SimpleThread extends Thread {

         public SimpleThread(String str) {

             super(str);

         }

         public void run() {

             for (int i = 0; i < 10; i++) {

                 System.out.println(i + " " + getName());

                 try {

                     sleep((int)(Math.random() * 1000));

                 } catch (InterruptedException e) {}

             }

             System.out.println("DONE! " + getName());

         }

     }

    public class TwoThreadsTest {

         public static void main (String[] args) {

             new SimpleThread("Go to Beijing??").start();

             new SimpleThread("Stay here!!").start();

          }

         }

    1. 编译、运行
    2. 请将程序的运行结果写在实验报告中。

    (三)实现Runnable接口的方法实现多线程

      1. 程序功能:一个时钟Applet,它显示当前时间并逐秒进行更新
      2. 编写Clock.java 程序文件,源代码如下。

    import java.awt.*;

     import java.applet.*; 

     import java.util.*;

     public class Clock extends Applet implements Runnable{

            Thread clockThread;

            public void start(){

                   if(clockThread==null){

                          clockThread=new Thread(this,"Clock");

                          clockThread.start();

                   }

            }

            public void run(){

                   while(clockThread !=null){

                          repaint();

                          try{

                                 clockThread.sleep(1000);

                          }catch(InterruptedException e){}

                       }

            }

            public void paint(Graphics g){

                     Date now=new Date(); g.drawString(now.getHours()+";"+now.getMinutes()+";"+now.getSeconds(),5,10);

            }

            public void stop(){

                   clockThread.stop();

                   clockThread=null;

            }

         }

    3.编译Clock.java 文件。

        

    4.编写Clock.html 文件,源代码如下:
    <HTML>

    <HEAD>

    <TITLE> A Simple Program </TITLE>

    </HEAD>

    <BODY>

    Here is the output of my program:

    <APPLET CODE="Clock.class" WIDTH=150 HEIGHT=25>

    </APPLET> 

    </BODY>

    </HTML>

    1. 在浏览器中打开Clock.html 文件,将你看到的运行结果写在实验报告中。

    (四)捕获并处理各种类型的异常

    1.编写ExceptionTest.java 程序文件,源代码如下。
     import java.io.*;
     public class ExceptionTest{
            public static void main(String args[]) {
                   for(int i = 0; i < 4;i++) {
                          int k;
                          try {
                                switch( i ) {
                                        case 0:        
                                               int zero = 0;
                                               k = 911 / zero;
                                               break;
                                        case 1:      
                                               int b[ ] = null;
                                               k = b[0];
                                               break;
                                        case 2:      
                                               int c[ ] = new int[2];
                                               k = c[9];
                                               break;
                                        case 3:      
                                               char ch = "abc".charAt(99);
                                               break;
                                 }
                          }catch(Exception e) {
                                 System.out.println("\nTestcase #" + i + "\n");
                                 System.out.println(e);
                          }
                   }
            }
     }

    2. 编译、运行

    3. 根据运行结果,请在实验报告中说明程序运行中总共捕捉了几个异常,并指出每个异常各自属于哪种类型的异常?

    答:捕捉到四个异常。

    Testcase #0

    java.lang.ArithmeticException: / by zero  除数为0

    Testcase #1

    java.lang.NullPointerException  属于空指针异常

    Testcase #2

    java.lang.ArrayIndexOutOfBoundsException: 9   属于数组下标9越界异常

    Testcase #3

    java.lang.StringIndexOutOfBoundsException: String index out of range: 99  属于字符串异常

    (五)了解异常处理模块中各个语句块的功能

    1.编写TryTest.java 程序文件,源代码如下。

     import java.io.*; 
     public class TryTest{
            public TryTest(){                        
                   try{
                          int a[] = new int[2];
                          a[4] = 3;
                          System.out.println("After handling exception return here?");
                   }catch(IndexOutOfBoundsException e){
                          System.err.println("exception msg:" + e.getMessage());
                          System.err.println("exception string:" + e.toString());
                          e.printStackTrace();
                   }finally{
                          System.out.println("-------------------");
                          System.out.println("finally");
                   }
                   System.out.println("No exception?");
            }
            public static void main(String args[]){
                   new TryTest();
            }
     } 

    2. 编译、运行

    3. 根据运行结果,将程序的运行结果写在实验报告中。

    4. 请在实验报告中指出程序中的语句System.out.println("After handling exception return here?"); 有没有被执行?

     

    (六)思考题

    1. 简述并区分程序、进程和线程三个概念。

    答:①程序是为完成特定任务、用某种语言编写的一组指令的集合。指一段静态的代码。

    ②进程是程序的一次执行过程,是系统进行调度和资源分配的一个独立单位。

    ③线程是比进程更小的执行单位。

    一个进程在其执行过程中,可以产生多个线程,形成多条执行线索。

    每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。

    一个线程有它自己的入口和出口,以及一个顺序执行的序列

    线程不能独立存在,必须存在于进程中。

    1. 线程有哪几个基本的状态?Java中线程调度遵循何种原则?

    答:线程的基本状态有新建、就绪、运行、阻塞、死亡。线程调度安照线程的优先级来调度线程的执行,具有高优先级的线程会在较低优先级的线程之前得到执行。同时线程的调度是抢先式的。

    1. 实现多线程可以用哪两种基本方法?将这两种方法进行比较。

    答:第一种方法是通过实现Runnable接口实现,第二种方法是通过继承Thread类,

     

    使用Runnable方式可以实现两条线程交替运行(注:不是绝对的交替),而用Thread无法实现。

    1. 异常是如何抛出、捕捉和处理的?

    答:

    1. 异常处理机制有哪些好处?

    答:通过异常处理,我们可以对用户在程序中的非法输入进行控制和提示,以防程序崩溃。

    展开全文
  • .NET 多线程异常处理

    2014-09-25 11:32:53
    多线程应用,在实际的项目或产品开发中,原则上来说,应该尽量避免(这是我一家之言,因为我不是一个一心可多用的人 )。但是在强调用户体验的要求下或开发平台的限制下(如 Silverlight Socket 通讯),我们不得不...

    http://www.cnblogs.com/AutumnalRiver/archive/2010/04/11/1709627.html


    多线程应用,在实际的项目或产品开发中,原则上来说,应该尽量避免(这是我一家之言,因为我不是一个一心可多用的人 )。但是在强调用户体验的要求下或开发平台的限制下(如 Silverlight Socket 通讯),我们不得不用多线程。

    多线程环境

    在我们的产品 SE 中,出现多线程的地方主要有两大类,一类是通过 ThreadPool 或 new Thread 主动发起多线程,另一类是 Socket 通讯回调。

    多线程异常捕获

    对于一般的异常处理来说,我们只要简单的将可能出错的语句包含在 try/catch 语句中即可。我也曾经简单的将该方法运用于多线程的异常捕获,结果并非如此,代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public  static  void  Main()
    {
         try
         {
             new  Thread (Go).Start();
         }
         catch  (Exception ex)
         {
             // 永远执行不到这儿!
             Console.WriteLine ( "Exception!" );
         }
    }
     
    private  static  void  Go()
    {
         throw  null ;
    }

    正确的做法应该是在新线程入口方法 Go 中捕获异常:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public  static  void  Main()
    {
         new  Thread (Go).Start();
    }
      
    private  static  void  Go()
    {
         try
         {
             ...
             throw  null ; // 该异常将会被捕获
             ...
         }
         catch  (Exception ex)
         {
             // 异常日志记录,或者通知其他线程出现异常了
             ...
         }
    }

    以上的正确做法来自 Threading in C# 中的小节 Exception Handling,该文涉及到 .NET 多线程的方方面面,是我看到最全最好的文章。

    正确捕获多线程异常的方法找到了,接下来我们自然会想:是不是每个线程入口方法都得这么做?

    且看 Threading in C# 中的小节 Exception Handling 的描述:从 .NET 2.0 开始,任何一个线程上未处理的异常都会导致整个应用程序关闭。因此,在每个线程入口方法中都必须要使用 try/catch 语句,至少在产品应用程序中必须如此,以免应用程序因为我们未预料到的代码而关闭整个应用程序。

    如果仅仅记下异常信息而不在乎应用程序异常关闭,那么有两个方法可以做到:

      1、对于 Windows Form 程序来说,有一个全局异常处理事件:Application.ThreadException;

      2、对于所有 .NET 程序来说,还有一个更低级的全局异常处理事件:AppDomain.UnhandledException;

    更高的要求

    我们能简单的通过全局异常处理事件来记录错误日志;如果保证不中断应用程序,也可以在每个线程入口方法中捕获异常并记录异常日志。有没有办法做到:既能捕获异常且不中断应用程序,又能如全局异常处理事件那样简单捕获异常?

    对于主动创建的新线程,至少可以做到这一点:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public  static  class  ThreadExecutor
    {
         public  static  bool  Execute(System.Threading.WaitCallback callback, object  state)
         {
             try
             {
                 return  System.Threading.ThreadPool.QueueUserWorkItem((data) =>
                 {
                     try
                     {
                         callback(data);
                     }
                     catch  (exception ex)
                     {
                         // log the exception
                     }
                 }, state);
             }
             catch  (Exception e)
             {
                 // log the exception
             }
             return  false ;
         }
    }


    展开全文
  • Java 处理多线程

    千次阅读 2017-09-05 17:49:37
    这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。  这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也...
  • 建议66:正确捕获多线程中的异常

    千次阅读 2016-09-07 10:50:19
    建议66:正确捕获多线程中的异常 多线程异常处理需要采用特殊的方式。一下这种方式会存在问题: try { Thread t = new Thread((ThreadStart)delegate { throw new Except
  • UI线程异常处理方法

    千次阅读 2015-07-12 21:15:00
    当应用程序启动,创建了一个叫“main”的线程,用于管理UI相关,又叫UI线程。其他线程叫工作线程(Work Thread)。 Single Thread Model 一个组件的创建并不会新建一个线程,他们的创建都在UI线程中进行,包括...
  • .NET多线程在实际应用中会出现一些异常问题,下面请看作者对于.NET多线程异常的一些处理方法。 多线程应用,在实际的项目或产品开发中,原则上来说,应该尽量避免(这是我一家之言,因为我不是一个一心可...
  • 处理未捕获的异常是每个应用程序起码有的功能,C#在AppDomain提供了UnhandledException 事件来接收未捕获到的异常的通知。常见的应用如下:  static void Main(string[] args) { AppDom
  • 什么时候该抛出异常,抛出什么异常?什么时候该捕获异常,捕获之后怎么处理异常?你可能已经使用异常一段时间了,...通过阅读本文,小伙伴们可以迅速在项目中使用比较推荐的异常处理原则来处理异常。 本文内容快速...
  • 正确处理kafka多线程消费的姿势

    万次阅读 多人点赞 2019-08-03 14:21:12
    所以,理解多线程的Consumer模型是非常有必要,对于我们正确处理kafka多线程消费很重要。 kafka多线程消费模式 说kafka多线程消费模式前,我们先来说下kafka本身设计的线程模型和...
  • 要知道如何处理,首先要知道 java 的中断机制。 引言 如果对 Java 中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此。 中断机制是如何工作的?捕获或检测到中断后,是抛出 ...
  • 在进行多线程编程时,OpenMP是个非常有效的工具,它能最大化的将你的并行处理发挥到极致。当然有如此便利的方面,自然也会有相应的限制条件。但是一旦熟悉使用,注意它的那几个原则,也不会有什么问题。  在最近的...
  • 多线程面试题(值得收藏)

    万次阅读 多人点赞 2019-08-16 09:41:18
    史上最强多线程面试47题(含答案),建议收藏 金九银十快到了,即将进入找工作的高峰期,最新整理的最全多线程并发面试47题和答案总结,希望对想进BAT的同学有帮助,由于篇幅较长,建议收藏后细看~ 1、并发编程三要素?...
  • Java多线程面试题(面试必备)

    万次阅读 多人点赞 2020-05-26 01:15:38
    文章目录一、多线程基础基础知识1. 并发编程1.1 并发编程的优缺点1.2 并发编程的三要素1.3 并发和并行有和区别1.4 什么是多线程多线程的优劣?2. 线程与进程2.1 什么是线程与进程2.2 线程与进程的区别2.3 用户线程...
  • Java异常以及处理原则

    千次阅读 2015-09-05 18:54:15
    Java异常以及处理原则 原则 Java的基本理念是“结构不佳的代码不能运行”。 发现错误的理想时机是在编译阶段,也就是在你试图运行程序之前。然而,编译期并不能找出所有的错误,余下的问题必须在运行期间解决。...
  • 多线程容易产生的40个问题汇总

    千次阅读 2019-10-22 19:15:04
    这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会...
  • Java多线程和线程池

    万次阅读 2016-05-12 21:28:53
    一、Java自带线程池先看看Java自带线程池的例子,开启5个线程打印字符串List:package com.luo.test;import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import ...
  • Java多线程代码编写

    千次阅读 2019-08-19 14:27:58
    Java多线程代码编写 什么是多线程 并发和并行  并行:指两个或多个时间在同一时刻发生(同时发生);  并发:指两个或多个事件在一个时间段内发生。 在操作系统中,安装了多个程序,并发指的是在一段时间内...
  • 多线程和高并发的常见面试题整理

    千次阅读 2020-07-12 11:46:03
    1.线程实现方式 1继承Thread类 定义Thread类的子类,并重写Thread类的run()方法,创建子类对象(即线程对象),调用线程对象的start()方法来启动该线程 2.实现Runnable接口 并重写该接口的run()方法,该run()方法...
  • QT多线程编程详解

    万次阅读 多人点赞 2019-04-24 22:08:20
    一、线程基础 1、GUI线程与工作线程 每个程序启动后拥有的第一个线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次...二、QT多线程简介 QT通过三种形式提供了对线程...
  • 深入了解多线程的原理

    万次阅读 多人点赞 2018-05-25 15:35:48
    即便不考虑多核心,在单核下,多线程也是有意义的,因为在一些操作,比如IO操作阻塞的时候,是不需要CPU参与的,这时候CPU就可以另开一个线程去做别的事情,等待IO操作完成再回到之前的线程继续执行即可 为什么...
  • Java多线程面试题

    万次阅读 2020-10-25 15:56:40
    sleep 方法: 是 Thread 类的静态方法,当前线程将睡眠 n 毫秒,线程进入阻塞状态。当睡眠时间到了,会解除阻塞,进行可运行状态,等待 CPU 的到来。睡眠不释放锁(如果有的话); wait 方法: 是 Object 的方法...
  • 这里写目录标题并发编程基础blocked 和 waiting 的区别线程的 run()和 start()有什么区别?为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?说说线程的生命周期及五种基本状态...
  • 并发编程(一)多线程基础和原理

    千次阅读 2020-07-19 01:44:02
    多线程基础 最近,准备回顾下多线程相关的知识体系,顺便在这里做个记录。 并发的发展历史 最早的计算机只能解决简单的数学运算问题,比如正弦、 余弦等。运行方式:程序员首先把程序写到纸上,然后穿 孔成卡片,...
  • Java 多线程总结笔记

    千次阅读 2018-09-19 10:21:56
    Java多线程总结笔记 实现多线程的方法 查看Thread类的源码,可以发现它实现了Runnable接口,然后在自己的run方法中调用了Runnable的run方法。这里其实就是静态代理这一设计模式,Thread是代理角色,而Runnable则是...
  • 单核 CPU 上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快, 看着像多个线程"同时"运行罢了。多核 CPU 上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,653
精华内容 37,061
关键字:

多线程异常处理原则