Contents

gt

gt 源码相关

线程相关

下面梳理下gt使用的线程

继承Thread类

在gt源码中,有两个继承了Thread的类,FCBuffer和WeakCollectionCleaner

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
protected boolean addFeature(SimpleFeature f) {
        if (ft == null) {
            ft = f.getFeatureType();
        }

        if (size >= features.length) {
            return false;
        }

        synchronized (this) {
            notify();

            features[end] = f;
            end++;

            if (end == features.length) {
                end = 0;
            }

            size++;
        }
        return true;
    }

wait()和notify()是Object类的方法,用于线程的等待与唤醒,必须搭配synchronized 锁来使用。

notify 方法是唤醒等待的线程. notify():随机唤醒一个处在等待状态的线程。 notifyAll():唤醒所有处在等待状态的线程。 无论是wait还是notify方法,都需要搭配synchronized锁来使用(等待和唤醒,也是需要对象) https://blog.csdn.net/qq_33479841/article/details/125596223

WeakCollectionCleaner

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    public void exit() {
        // try to stop it gracefully
        synchronized (this) {
            referenceQueue = null;
        }
        this.interrupt();
        try {
            this.join(500);
        } catch (InterruptedException e) {

        }
    }
  • 使用变量控制线程退出(通知方式)
  • 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

 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public static void main(String[] str) {
        String refid = "1";
        Hints hints = new Hints();
        FeatureFinder finder = new FeatureFinder(refid, hints);
        Feature foundFeature = null;

        Thread thread = new Thread(finder);
        long startTime = System.currentTimeMillis();
        thread.start();
        try {
            while (thread.isAlive()
                    && (System.currentTimeMillis() - startTime) / 1000
                    < Integer.MAX_VALUE) {
                Thread.sleep(100);
            }
            thread.interrupt();
            // joining ensures synchronisation
            thread.join();
            foundFeature = finder.getFeature();
        } catch (InterruptedException e) {
            // clean up as best we can
            thread.interrupt();
            throw new RuntimeException("Interrupted while resolving resource " + refid);
        }
        if (foundFeature != null) {
            System.out.println(foundFeature.toString());
        }
    }
    
private class FeatureFinder implements Runnable {

        private Feature feature = null;

        private String refId;

        private Hints hints;

        public Feature getFeature() {
            return feature;
        }

        public FeatureFinder(String refId, Hints hints) {
            this.refId = refId;
            this.hints = hints;
        }

        @Override
        public void run() {
            try {
                feature =
                        DataAccessRegistry.getInstance()
                                .findFeature(new FeatureIdImpl(refId), hints);
            } catch (IOException e) {
                // ignore, no resolve
            }
        }
    };

?? 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

多线程之间的通信方式

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)