gt
gt 源码相关
线程相关
下面梳理下gt使用的线程
继承Thread类
在gt源码中,有两个继承了Thread的类,FCBuffer和WeakCollectionCleaner
|
|
wait()和notify()是Object类的方法,用于线程的等待与唤醒,必须搭配synchronized 锁来使用。
notify 方法是唤醒等待的线程. notify():随机唤醒一个处在等待状态的线程。 notifyAll():唤醒所有处在等待状态的线程。 无论是wait还是notify方法,都需要搭配synchronized锁来使用(等待和唤醒,也是需要对象) https://blog.csdn.net/qq_33479841/article/details/125596223
WeakCollectionCleaner
|
|
- 使用变量控制线程退出(通知方式)
- Interrupt 方法结束线程 使用 interrupt()方法来中断线程有两种情况: 1. 线程处于阻塞状态:如使用了 sleep,同步锁的 wait,socket 中的 receiver,accept 等方法时,会使线程处于阻塞状态。当调用线程的 interrupt()方法时,会抛出 InterruptException 异常。 阻塞中的那个方法抛出这个异常,通过代码捕获该异常,然后 break 跳出循环状态,从而让我们有机会结束这个线程的执行。 通常很多人认为只要调用 interrupt 方法线程就会结束,实 际上是错的, 一定要先捕获 InterruptedException 异常之后通过 break 来跳出循环,才能正常结束 run 方法。 2. 线程未处于阻塞状态:使用 isInterrupted()判断线程的中断标志来退出循环。当使用 interrupt()方法时,中断标志就会置 true,和使用自定义的标志来控制循环是一样的道理。 ———————————————— 版权声明:本文为CSDN博主「REXmama」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/REXmama/article/details/126179069
- 三.stop 方法终止线程(线程不安全) 程序中可以直接使用 thread.stop()来强行终止线程,但是 stop 方法是很危险的,就象突然关 闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果,不安全主要是: thread.stop()调用之后,创建子线程的线程就会抛出 ThreadDeatherror 的错误,并且会释放子 线程所持有的所有锁。一般任何进行加锁的代码块,都是为了保护数据的一致性,如果在 调用 thread.stop()后导致了该线程所持有的所有锁的突然释放(不可控制) ,那么被保护数据就有可能呈 现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误。因 此,并不推荐使用 stop 方法来终止线程。 ———————————————— 版权声明:本文为CSDN博主「REXmama」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/REXmama/article/details/126179069
- join()方法的作用 主要作用是同步,它可以使得线程之间的并行执行变为串行执行。在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。
implements Runnable
|
|
?? FeatureFinder 怎么判断被停止,interrupt和join之间的状态怎么获取
implements Callable
TileDecoder
TileDecoder implements Callable
通过线程池创建多线程
前面几种方法创建的Thread实例在执行完成之后是不可复用的,实际工作中需要对已创建好的线程实例进行复用,需要用到线程池。 ExecutorService是Java提供的一个线程池接口,每次在异步执行target目标任务的时候,可以通过ExecutorService线程池实例去提交或者执行。ExecutorService实例负责对池中的线程进行管理和调度,并且可以有效控制最大并发线程数,提高系统资源的使用率,同时提供定时执行、定频执行、单线程、并发数控制等功能 Executors创建线程的4种方法
wait/notify方法
Thread.sleep()方法和Object.wait()、Object.notify()方法的区别
首先,要记住这个差别,“sleep是Thread类的方法,wait是Object类中定义的方法”。尽管这两个方法都会影响线程的执行行为,但是本质上是有区别的。
- Thread.sleep不会导致锁行为的改变,如果当前线程是拥有锁的,那么Thread.sleep不会让线程释放锁。如果能够帮助你记忆的话,可以简单认为和锁相关的方法都定义在Object类中,因此调用Thread.sleep是不会影响锁的相关行为。
- Thread.sleep和Object.wait都会暂停当前的线程,对于CPU资源来说,不管是哪种方式暂停的线程,都表示它暂时不再需要CPU的执行时间。OS会将执行时间分配给其它线程。区别是,调用wait后,需要别的线程执行notify/notifyAll才能够重新获得CPU执行时间。
- 线程的状态参考 Thread.State的定义。新创建的但是没有执行(还没有调用start())的线程处于“就绪”,或者说Thread.State.NEW状态。
- Thread.State.BLOCKED(阻塞)表示线程正在获取锁时,因为锁不能获取到而被迫暂停执行下面的指令,一直等到这个锁被别的线程释放。BLOCKED状态下线程,OS调度机制需要决定下一个能够获取锁的线程是哪个,这种情况下,就是产生锁的争用,无论如何这都是很耗时的操作。 https://blog.csdn.net/qq_25729265/article/details/123367482
线程的状态
线程的通信
Feature
FeatureBuilder
FeatureBuilder是个抽象类,有SimpleFeatureBuilder和ComplexFeatureBuilder扩展, SimpleFeatureBuilder 线程不安装 SimpleFeature和Feature区别 public interface SimpleFeature extends Feature
多线程之间的通信方式
- Object的wait() / notify()方法
- Lock和Condition的await() / signal()方法
- BlockingQueue阻塞队列方法 https://blog.csdn.net/qq_44755403/article/details/105376626 Java多线程(2万字深入理解多线程,有实例代码辅助理解) https://blog.csdn.net/qq_37685457/article/details/89738269 多线程之间通信的七种方式
StreamingRendererTest
- PipedInputStream / PipedOutputStream
8中基础类型
八种基本数据类型其中包括整数型,浮点型,字符类型和布尔型。
整数型:byte,short,int,long
浮点型:float,double
布尔型:boolean
字符类型: char
byte:
1.byte数据类型是8位、有符号,以二进制补码表示的整数;
2.最小值是-128(-2^7);
3.最大值是127(2^7-1);
4.默认值是 0;
5.byte类型用于在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int类型的四分之一;
6.例子:byte a=100, byte b=-50。 Byte.valueOf
char:
1.char 类型是一个单一的16位 Unicode 字符;
2.最小值是\u0000(十进制等效值为0);
3.最大值是 \uff(即为65535);
4.char 数据类型可以储存任何字符;
5.例子:char letter =‘A’;。
Character.isDigit(ch)