java学习笔记之线程(一),java学习笔记线程

首先得明白什么是线程安全:

线程(一)

线程安全是编程中的术语,指某个函数
(计算机科学))、函数库在多线程环境中被调用时,能够正确地处理各个线程的局部变量,使程序功能正确完成。

一、线程定义于组成:

1.创建任务和线程:

1 TaskThread task = new TaskThread();     // 创建任务
2 Thread taskThread  = new Thread(task);  // 根据任务创建对应的执行线程

2.任务 ,实现Runnable 接口

Override run()方法

1 class TaskThread implements Runnable{
2    ...
3    public void run(){
4      //执行体 ,告诉系统如何执行线程
5    }
6 }
7  

3.执行线程的class
内,调用start()方法执行线程

1 threadtask.start()                   // 主程序启动线程

这是维基百科里的资料,看完后还不是特别的明白。我自己的理解就是在多线程环境下,某块代码中访问的资源不会发生冲突。

二、Thread类

1.方法:

1 Thread()                             // 创建空线程
2 Thread(task:Runnable)                // 创建指定任务线程
3 start():void                         // 启动线程run()被jvm执行
4 isAlive():boolean                    // 测试当前线程是否在执行
5 join():void                          // 等待 线程结束
6 setPriority(p:int ):void             // 设置线程优先级,
7 sleep(mills:long):void               // 线程睡眠 mills毫秒
8 yield():void                         // 暂停当前线程并允许其他线程执行
9 interrupt():void                     // 中断线程             

2.sleep()

sleep() 可能抛出 InterruptException
的必检异常,java里强制try/catch 必检异常。

3.线程优先级

Thread 里 定义的int常量
对应不同的优先级:

MIN_PRIORITY 代表 1;

NORM_PRIORITY 代表 5;

MAX_PRIORITY 代表 10;

Thread.NORM_PRIORITY
为主线程优先级

JVM总是执行优先级高的线程,再执行低的。当线程优先级相同时,将线程放入循环队列里,循环调度。

 

三、 线程池

我们对一个任务创建一个线程时用的是Thread类,而我们要为多个任务创建线程时,我们就要用到线程池

Executor接口
执行线程池内的任务

ExecutorService 是Executor
子接口

Executors类里,静态方法 **newFixedThreadPool( int threadNum )** 
创建Executor对象 / /在线程池创建固定数目的线程

 1 import java.util.concurrent.ExecutorService;
 2 import static java.util.concurrent.Executors.newFixedThreadPool;
 3 public class ExecutorDemo {    
 4   public static void main(String []args){       
 5     ExecutorService excutor =  newFixedThreadPool(3);     // 静态方法不用new 对象,直接调用 newFixedThreadPool()   ,最大线程数为3    
 6     excutor.execute(new PrintChar('a',100));              // 第一个线程添加到 线程池
 7     excutor.execute(new PrintChar('b',100));        
 8     excutor.execute(new PrintNum(100));        
 9     excutor.shutdown();                                   // 执行器关闭
10  }
11 }

 

线程(一) 一、线程定义于组成: 1.创建任务和线程: 1 TaskThread task =
new TaskThread(); // 创建任…

 

写这篇笔记的起因是上周的支付宝电话面试中问了我一个线程安全的问题,就是有一个类,他的方法A是加了synchronized关键字的,然后分别创建这个类的两个实例,请问,当多个线程同时访问这两个实例中的方法A时synchronized会起作用吗?

 

当时我的回答还是很明确而自信的说“会”,今天觉得这个问题要好好研究一下,于是就写了代码做了一下测试,发现自己答错了,这或许是我面试失败的原因之一吧。代码贴出来:

class Thread2 extends Thread{
    public void run() {
        MyObj obj = new MyObj();
        try {
            obj.sayHello(3000);//3秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class Thread3 extends Thread{
    public void run() {
        MyObj obj = new MyObj();
        try {
            obj.sayHello(1000);//1秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class MyObj {
    public synchronized void sayHello(int delay) throws InterruptedException{        
        Thread.sleep(delay);
        System.out.println("delay" + delay);
    }
}
public class ThreadTest {
      public static void main(String[] args) throws Exception{
        Thread2 t2 = new Thread2();
        Thread3 t3 = new Thread3();
        t2.start();//先让t2线程启动,因为t2要等待3秒,如果线程同步有作用的话t3会处理阻塞状态
        t3.start();
      }
}

代码中的MyObj类就是我用于测试的线程安全的对象,它包含了一个sayHello方法,他是带有synchronized关键字的。但测试结果却是

delay1000
delay3000

这说明关键字没有起作用,也说明了不同的对象实例synchronized方法时是线程不安全的。知道这个结果心里有些难过,只不过事情已经过去就当是学习了经验吧。

 

synchronized除了修饰方法外,还可以修饰代码块,那就试试看吧,写了一个新的类:

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注