Java高级编程8-姜国海 多线程编程

线程创建 实现runable接口

public class CreateThread  Runable{
    public void run(){
    }

}

匿名类

没有构造函数
父类的初始化 明确的调用

class A{
    int i;
    A(int i){
        this.i = i;
    }
    public static void main(){
        A a = new A(0);
        A b = new A(2){//匿名类没有构造函数,这里的代码充当构造函数的作用
                        };
        K k = new K(){//K是抽象的接口,这里调用的是Object的构造函数的,不是接口的构造函数
        }
    }
}

//匿名类没有类型,只能用父类的引用调用

new A(0){public void a(){}}.a();

内部类

class A {
    class C{//该类的定义依赖于A类的对象
    }
    想不被依赖
    static class C{
    }
    static abstract 可以同时修饰类,不可以同时修饰函数
    void a(){
    }
}

一个语法现象

class A {
    int i = 0;
    class  B {
        int t;
        void a(){
        //调用两个i
            A.this.i = 9;
            B.this.i = 9
        }
    }
}
sleep函数会抛出检查异常,需要放在try catch 里面

创建线程的方法

继承Thread 重写run方法
Thread t3 = new Thread(){public void run(){}};
实现Runable 接口
Thread t4 = new Thread(new Runable(){public void run(){}});

多线程编程存在临界区问题

两个或多个线程访问全局变量的时候会出现数据的紊乱

解决方案 加锁 (例如:排号机)...这里有故事

synchronized public char pop(){//同步控制
    index--;
    return data[index];
}


synchronized 可以修饰函数或者代码段
执行同步代码之前必须抢到对象的锁 执行完之后释放锁
将同步的程序 变成串行的 同步的

处于争夺锁的线程,都处于阻塞状态时,虚拟机不保证线程对的强锁顺序,但是一般是先进入阻塞状态的线程优先抢到锁

访问类的成员变量 即全局变量的时候就需要加上同步约束

决绝冲突的办法 一个是加锁 一个是数据复制

public void a(){
    synchronized(data){
        //这里是同步代码
    }
}

划分不同的同步块

class A {
    int i,j;
    double x,y;
    private Object lock1 = new byte[0];
    private Object lock2 = new byte[0];

    a(){
        synchronized(lock1){
            x,y;
        }

    }

    b(){
        synchronized(lock1){
            x,y;
        }
    }

    c(){
        synchronized(lock2){
            i,j;
        }
    }
    d(){
        synchronized(lock2){
            i,j;
        }
    }
}

wait

执行wait操作的线程,释放CPU的执行权,同时释放锁

synchronized public char pop() {
    while(index==0){
        try{
            wait();//释放锁
        }catch(e){
            e.printStackTrace();
        }
    }
    data[index] = c;
    index++;
    notify();//唤醒一个处于wait线程,一般是最先阻塞的线程

}

volatile

只能修饰成员变量,保证对这个数据的操作是原子的

已标记关键词 清除标记
第二次作业: 1. 编写点类(Point类),属性成员有x,y,都是double数据类型。需要为Point类编写构造函数。 编写直线类(Line类),需要提供两点确定一条直线的函数功能。 如果两点重合,可以返回异常或者返回null引用来解决这个问题。 直线类的数据成员和函数成员请自行设计。 2. 给定文本文件,文件名称为a.txt,文件内容为一个88列的字符矩阵,内容为1和0字符, 请编程计算出该矩阵中水平方向或者垂直方向或者斜线方向连续1最多的个数。 例如: 11001101 10110101 01010101 11001000 01010101 11001101 00011000 11110000 3. 编写程序求出1万以内的所有素数,并将这些素数输出到一个文本文件中,每行文本只包含一个素数数据。 该文本文件内容要求可以用记事本程序来查看。 4. 编写程序求出1万以内的所有素数,然后再判断这些素数中哪些是由素数拼接而成的。 例如素数23就符合条件,23本身是素数,其由素数2,和素数3拼接(连接)组成。 素数29就不满足条件,2是素数,而9不是素数。素数307不满足条件,不能忽略0. 7907这个素数符合条件,7是素数,907是素数。 需要把符合条件的拼接素数全部输出,并统计个数。 5. 要求从控制台输入英语单词及单词解释两项数据, 把录入的数据追加到文件中。要求提供单词查询功能。 用户输入单词后,从单词库文件中查找,如果存在则输出 该单词的解释。注意,单词不能有重复,如果重复则覆盖替换 以前的解释数据。 6. 通过命令行参数输入一个文件夹的路径名称,然后编写程序找出该文件夹下文件名称重复并且文件大小也一样的文件, 如果没有“重复文件”,则输出“没有重复文件”的提示,如果有,需要输出文件名称,和文件所在的文件夹路径(绝对路径)。 提示,需要遍历该文件夹下所有子文件夹,设计一个文件类,属性包括文件名称,文件路径,文件大小,然后进行“重复” 判断,如果文件重复,则需要记录并输出,有可能有文件名重复,但是文件大小不一样,重复的文件可能不止2个,可能 在不同的子文件夹下有多个文件重复。 7. 霍夫曼编码实现压缩文本文件,见文件huffman.rar. 对文件数据读写等功能已经实现,程序在Q2Resources.zip中。 Q2Resources.zip中的文件禁止修改。请将TextZip.java文件所有未实现的函数按照要求给以实现。 改成了控制台输入,因为命令行输入太麻烦了,不过像用命令行也就是改一改就好。
相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页