您现在的位置是:主页 > news > 阿里云网站申请用途/seowhy官网

阿里云网站申请用途/seowhy官网

admin2025/4/30 8:29:15news

简介阿里云网站申请用途,seowhy官网,电脑做网站主机空间,在网上做兼职美工有哪些网站1.进程(Processes)和线程(Threads)的区别进程拥有自己的变量以及共享这些数据的线程,同一个进程中的线程可以分享这个进程中的变量等等属性.虽然这种数据共享有一定的风险(需要用锁的那几种情况?),但是方便了线程之间的通信.而且线程通常更加轻量化.2.为啥要用多线程(MultiThr…

阿里云网站申请用途,seowhy官网,电脑做网站主机空间,在网上做兼职美工有哪些网站1.进程(Processes)和线程(Threads)的区别进程拥有自己的变量以及共享这些数据的线程,同一个进程中的线程可以分享这个进程中的变量等等属性.虽然这种数据共享有一定的风险(需要用锁的那几种情况?),但是方便了线程之间的通信.而且线程通常更加轻量化.2.为啥要用多线程(MultiThr…

1.进程(Processes)和线程(Threads)的区别

进程拥有自己的变量以及共享这些数据的线程,同一个进程中的线程可以分享这个进程中的变量等等属性.虽然这种数据共享有一定的风险(需要用锁的那几种情况?),但是方便了线

程之间的通信.而且线程通常更加轻量化.

2.为啥要用多线程(MultiThreads)?

像书中那个小球弹来弹去的例子(Core Java Vol.1),如果只是单线程运行,在小球完成弹STEPS次并return之前,整个程序对其他操作都是没有相应的.对于网站访问来说也是一样,如

果服务器每次只能处理一个客户端的请求,那基本是凉透了.

多线程很好的解决了这个问题,每个小球都在自己的线程里面弹跳,互不干扰,GUI也可以及时响应点击button的消息,世界又美好了一点点.

Tip1:可以使用继承Thread的方式来构建新的线程(如下),但是并不推荐这样做

class MyThread extends Thread{

public void run(){

blah blah;

}

}

因为我们应该对需要并行执行的任务和执行他们的机制进行解耦(decouple),如果并行任务量很大的话,为每个任务实例化一个线程的开销也是很爆炸的,这时候需要线程池(?)帮忙.

Tip2:不要直接调用Thread类或实现Runable接口的run()方法,这样会导致任务在同一个线程中执行.正确的方法是调用Thread.start方法,这样会创建新的线程来执行run方法.

3.中断线程(Interrupting Threads)

线程会在run方法return时,或者有未被捕获的异常发生时终止,以前的版本中的suspend和stop也可以终止线程,但是已经弃用(?).除了这个stop以外,没有方法可以强制

终止线程,但是调用interrupt方法可以请求终止线程.

当interrupt方法被调用时,这个线程的Interrupted status(一个boolean的flag,每一个线程都有)会被置true.想检查一个线程是否被中断可以通过Thread.currentThread得

到当前线程,然后调用isInterrupted来检查.

但是情况不总是这么友好,当一个线程被block时(这个要怎么翻译?屏蔽?),interrupted status是没办法检测的,sleep和wait都算blocking call,当这类方法被调用时,他们会被

InterruptionException中断(blocking I/O 调用没法子中断,那是啥玩意?).通常来讲这种线程的run方法长成这个样子:

Runnable r = () -> {

try{

while(!Thread.currentThread().isInterrupted() && more checks here){

do something;

}

}

catch(InterruptedException e){

//when the thread is interrupted during sleep or wait, it goes here.

}

finally{

//cleanup the mess.

}

//exiting and terminates the thread

};

在这个例子里,如果每次循环都调用sleep或者wait等方法,isInterrupted这个检查就完全没有必要了.因为如果对一个已经被interrupt的对象调用sleep这种方法会在

清空flag之后抛出一个InterruptedException异常.所以如果调用了blocking call,就直接在catch模块里处理就好了,不要再去调用isInterrupted了.

Tip3:interrupted和isInterrupted他俩长得很像,但是注意interrupted是Thread中的静态方法,会检查当前线程的interrupted status,并会清空状态!

Tip4:如果调用了blocking call,又实在不知道catch里该写啥,请:

catch中调用Thread.currentThread().interrupt();,方便调用者测试(?)

直接将方法标记上throws InterruptedException,然后扔掉try…catch…那套,让调用函数或者run方法来截获异常.

4.线程状态

New: 当线程刚被new出来时,他就是这个状态了.这个状态下可以理解为做一些必要的bookkeeping job.

Runnable: 当调用start方法时,线程就会变成这个状态,但是不一定会运行内部代码,是否运行取决于操作系统,time slice给到他的时候就会运行了.

Blocked: 当线程尝试获取被其他Object持有的内在锁(intrinsic lock)的时候,线程会变为blocked状态(这个锁不是java.util.concurrent中的锁).当其他线

程释放内在锁之后,会按顺序持有内在锁.

Waiting: 当线程在等待其他线程的通知的时候,会进到这个状态.(比如调用Object.wait或者Thread.join之类),实际使用中和Blocked区别并不大.

Timed waiting: 和Waiting差不多,只不过他是有耐心值的(比如Thread.sleep这种),超时之后也会跳转到Runnable.

Terminated: 要么生命周期结束,自然死亡;要么出了未捕获的异常,暴毙而亡.

Tip5: Intrinsic Lock

class A{

public synchronized void method1(){...}

public synchronized void method2(){...}

}

内在锁是针对Object的,如果线程A中在执行method1(),那么线程B就没法进入method2().

Tip6:注意不要试图通过线程优先级设置使程序正常运行,比如Linux上的JVM是根本不鸟优先级的,所有线程优先级都是一样的.而且优先级的设置可能会导致低

优先级的进程饿死(永远不会被执行).

5.守护线程(Daemon Thread)

这货存在的意义就是为其他的线程服务,比如提供时钟,做cleanup等等,当JVM中只有守护线程存在时,JVM会退出.所以不要在守护线程中访问文件或数据库这种资源,

因为你也不知道什么时候他就死了.注意setDaemon(boolean isDaemon)必须在线程start之前调用.