Java 多线程初学

来源:互联网 发布:qq空间免费刷人气软件 编辑:程序博客网 时间:2024/05/21 06:16

在开始学习多线程时,我先明白了以下几点内容

1.Thread 实现了接口 Runnable

共同点:使用两种方式创建的线程工作的性质时一样的

不同点:Java语言是单根继承,例如你只可以有一个亲爹一样。

从而实现接口的好处就体现出来了,列如你还可以认很多干爹(一边实现,一边继承。更具有扩展性)

2.public static void main()方法是由一个叫做 主线程main 的线程在调用。

一个进程在运行状态下,至少有一个线程在运行,Java 同样是如此的(注意在控制台中输出的main 和 main()方法没有任何关系)

通过 System.out.println(Thread.currentThread.get.Nama())会发现控制台输出此线程名为 main。

3.多线程 比 单线程 执行的优势在于更加充分的使用CUP的资源。

4.线程执行具有随机性

线程是一个子任务,CPU以不确定的方式,以随机的时间来调用线程中的方法(在此我明白了,main()方法不也同样是main线程里的方法么?)

5.线程执行具有异步执行的效果

在此我知道了线程启动需要调用start(),此方法会通知“线程规划器”此线程已经准备就绪,

等待调用Thread中的run(),为异步执行。(其实就是告诉系统安排一个时间来运行线程)

而直接调用run()为同步执行,因为这跳过了“线程规划器”,而是由 主线程 main 来调用的,

因此必须等run()方法中的代码执行完后才会执行后面的代码。

6.start()方法的顺序不代表线程启动的顺序(参考5)

7.Thread类中有这样一个构造器 Thread(Runnable target) 说明支持传入Runnable接口的对象

同时 Thread类也实现了Runnable接口,所以也支持传入一个Thread类的对象

这样做完全可以将一个Thread对象中的run()方法交由其他的线程进行调用。(此处需要注意,使用Thread.currentThread() 与 this.是有差别的前者是当前启动线程,后者是被交给当前线程调用的线程)

8.自定义线程中的实例变量针对其他线程可以有共享与不共享之分

不共享:创建多个同一线程对象,但是他们的数据是不共享的。

共享:实现共享数据的情况就是多个线程可以访问同一个变量(参考7)

于此同时,会产生“非线程安全”,在一些JVM中 i--这一操作分为3步:

1).读取原有i值。2).计算i-1。3).对i进行赋值。

如果有多个线程同时访问,那么就会出现非线程安全问题。(解决的方法是在run()方法前加synchronized“顺序队列的方法”)

当一个线程调用run()前会判断run是否被上锁,如果上锁,说明其他线程正在调用run()方法,必须等待执行完才可以执行。(加上synchronized的代码被称为“互斥区”或“临界区”

9.“非线程安全”主要是指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被改变的现象。

例如,多个线程同时访问一个类中的变量,而在另一个线程在他还未执行完时得到执行权,修改了变量值。这样就会引发“非线程安全”。

-- ++ 操作在println()中也会出现异常,虽然println内部实现了同步,但是 --  ++ 操作却是在进入之前发生的。

10.sleep()方法的作用是在指定的毫秒数内让“当前正在执行的线程”睡眠(暂停执行,具体那个线程执行的操作参考7)

11.线程优先级具有继承特性(A线程开启B线程,则B线程的优先级和A相同)

     线程优先级具有规则性(线程优先级高的线程总是大部分先执行完毕)

     线程优先级具有随机性(线程优先级高的不一定总是先执行完毕)

     同时线程优先级高的运行的次数多。