研究生该怎么去学习相关的建模仿真,但是不会搭模型写代码

研究生该怎么去学习相关的建模仿真,知道方法,有数据,但是不会搭模型写代码,不会处理数据,仅仅通过看文献够吗?

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/198017
  • 这篇博客你也可以参考下:当调用外部接口发生异常、服务器宕机或杀死进程时如何保证数据一致性
  • 除此之外, 这篇博客: 当线程池中线程出现异常会发生什么中的 问题来了,我们的代码中异常不可能全部捕获 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 如果要捕获那些没被业务代码捕获的异常,可以设置Thread类的uncaughtExceptionHandler属性。这时使用ThreadFactoryBuilder会比较方便,ThreadFactoryBuilder是guava提供的ThreadFactory生成器

    new ThreadFactoryBuilder()
    .setNameFormat("customThread %d")
    .setUncaughtExceptionHandler((t, e) -> System.out.println(t.getName() + "发生异常" + e.getCause()))
    .build()
    

    修改之后:

    public class ThreadExecutor {
    
    	private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS,
    			new ArrayBlockingQueue<>(200),
    			new ThreadFactoryBuilder()
    					.setNameFormat("customThread %d")
    					.setUncaughtExceptionHandler((t, e) -> System.out.println("UncaughtExceptionHandler捕获到:" + t.getName() + "发生异常" + e.getMessage()))
    					.build());
    
    	@Test
    	public void test() {
    		IntStream.rangeClosed(1, 5).forEach(i -> {
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    
    			threadPoolExecutor.execute(() -> {
    				System.out.println("线程" + Thread.currentThread().getName() + "执行");
    				int j = 1 / 0;
    			});
    		});
    	}
    }
    
    线程customThread 0执行
    UncaughtExceptionHandler捕获到:customThread 0发生异常/ by zero
    线程customThread 1执行
    UncaughtExceptionHandler捕获到:customThread 1发生异常/ by zero
    线程customThread 2执行
    UncaughtExceptionHandler捕获到:customThread 2发生异常/ by zero
    线程customThread 3执行
    UncaughtExceptionHandler捕获到:customThread 3发生异常/ by zero
    线程customThread 4执行
    UncaughtExceptionHandler捕获到:customThread 4发生异常/ by zero
    

    可见,结果并不是我们想象的那样,线程池中原有的线程没有复用! 所以通过UncaughtExceptionHandler想将异常吞掉使线程复用这招貌似行不通。它只是做了一层异常的保底处理

    • 将excute改成submit试试
    public class ThreadExecutor {
    
    	private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS,
    			new ArrayBlockingQueue<>(200),
    			new ThreadFactoryBuilder()
    					.setNameFormat("customThread %d")
    					.setUncaughtExceptionHandler((t, e) -> System.out.println("UncaughtExceptionHandler捕获到:" + t.getName() + "发生异常" + e.getMessage()))
    					.build());
    
    	@Test
    	public void test() {
    		IntStream.rangeClosed(1, 5).forEach(i -> {
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    
    			Future<?> future = threadPoolExecutor.submit(() -> {
    				System.out.println("线程" + Thread.currentThread().getName() + "执行");
    				int j = 1 / 0;
    			});
    			try {
    				future.get();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			} catch (ExecutionException e) {
    				e.printStackTrace();
    			}
    		});
    	}
    }
    
    线程customThread 0执行
    java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
    线程customThread 0执行
    java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
    线程customThread 0执行
    java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
    线程customThread 0执行
    java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
    线程customThread 0执行
    java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
    

    通过submit提交线程可以屏蔽线程中产生的异常,达到线程复用。当get()执行结果时异常才会抛出。
    原因是通过submit提交的线程,当发生异常时,会将异常保存,待future.get();时才会抛出。
    这是Futuretask的部分run()方法,看setException:

    public void run() {
            try {
                Callable<V> c = callable;
                if (c != null && state == NEW) {
                    V result;
                    boolean ran;
                    try {
                        result = c.call();
                        ran = true;
                    } catch (Throwable ex) {
                        result = null;
                        ran = false;
                        setException(ex);
                    }
                    if (ran)
                        set(result);
                }
            } 
        }
    
        protected void setException(Throwable t) {
            if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) {
                outcome = t;
                UNSAFE.putOrderedInt(this, stateOffset, EXCEPTIONAL); // final state
                finishCompletion();
            }
        }
    

    将异常存在outcome对象中,没有抛出,再看get方法:

        public V get() throws InterruptedException, ExecutionException {
            int s = state;
            if (s <= COMPLETING)
                s = awaitDone(false, 0L);
            return report(s);
        }
    
        private V report(int s) throws ExecutionException {
            Object x = outcome;
            if (s == NORMAL)
                return (V)x;
            if (s >= CANCELLED)
                throw new CancellationException();
            throw new ExecutionException((Throwable)x);
        }
    

    当outcome是异常时才抛出。

  • 您还可以看一下 传智老师的多角度带你编写更规范的黑盒测试用例课程中的 等价类设计测试用例的步骤小节, 巩固相关知识点