Java语言规范线程形式范例

开发 后端
Java语言规范如何才能更好的进行使用?下面我们就看下在实际的应用中详细的学习下Java语言规范的相关知识。希望大家有所收获。

在一开始接触Java的时候我们没有很注意Java语言规范,其实这是不对的。下面我们就来看看开始执行Java语言规范程序后,至少会有一个线程开始操作,有操作的是被称为主线程的线程,主线程执行输入类的main()。当main()里的所有处理均结束后,则主线程也同时结束。

当应用程序的规模大到一定程度,程序里的多线程会以每种形式存在。以下是几个常见的范例:

1) GUI应用程序。

2) 比较花费时间的I/O处理。

3) 多个客户端。

如欲启动线程时,有下列两种方法:

1) 利用Thread类的子类的实例,启动线程。

2) 利用Runnable接口的实现类的实例,启动线程。

要注意的是,“Thread的实例”和“线程本身”是两个不同的部分。即使建立了Thread的实例,也还没有启动线程,而且就算线程已经结束,Thread实例也不会就这样消失。

建立一个实现Runnable接口的类,将该类的实例传给Thread的构造函数,调用start()...,这就是利用Runnable接口来启动线程的方法。

记住:无论哪种方式,启动新线程的方法永远是Thread类的start()。#t#

利用Thread类的sleep()可以暂停线程的执行。执行下面的语句时,即可让当前的线程(执行此语句的线程)暂时停止越1000ms。
Thread.sleep(1000);

当实例方法加上关键字synchronized声明之后,就可以只让一个线程操作某类实例的这类方法。“让一个线程操作”并不是说只能让某一个特定的线程操作而已,而是指一次只能让一个线程执行。这种方法称为synchronized方法(同步方法)。

synchronized实例方法是使用this锁定去做线程的共享互斥。synchronized类方法是使用该类的类对象的锁定去做线程的共享互斥。

Java语言规范线程的协调(这三种方法执行的前提是执行线程手中有obj的锁):

1) obj.wait()是把现在的线程放到obj的wait set;

2) obj.notify()是从obj的wait set里唤醒一个线程;

3) obj.notifyAll()是唤醒所有在obj的wait set里的线程。

被唤醒的线程只是处于等锁状态(但已经不再wait set中了),当时的obj的锁还掌握在执行notify()或notifyAll()的线程手上。当唤醒的线程得到锁之后,将从wait()之后继续执行。Introduction

Java语言规范多线程程序的评量标准

安全性--不损坏对象。

生存性--进行必要的处理。(liveness)

复用性--可再利用类。

性 能--能快速、大量进行处理。

Single Threaded Execution - 能通过这座桥的,只有一个人

Single Threaded Execution是指“以一个线程执行”的意思。就象细独木桥只能允许一个人通过一样,这个模式用来限制只让一个线程运行。

在Single Threaded Execution Pattern中,我们将unsafeMethod加以防卫,限制同时只能有一个线程可以调用它(加上synchronized)。这个必须让单线程执行的程序范围,我们称为“临界区”(critical section)。

使用Single Threaded Execution Pattern时,可能会有发生死锁(deadlock)的危险。

当SharedResource的字段开放给子类访问时,可能会因为子类写出unsafeMethod而导致丧失安全性。

synchronized方法和synchronized块,无论碰到return或是异常,都会确实解除锁定。

结论,Java语言规范中:

1) 基本类型、引用类型的指定、引用是原子的操作。

2) 但是long和double的指定、引用是可以分割的。

3) 要在线程间共享long或double的字段时,必须在synchronized中操作,或是声明成volatile。
 

责任编辑:张浩 来源: 博客园
相关推荐

2012-02-28 10:38:29

Java

2023-08-02 09:29:40

任务池TaskPool

2023-08-01 16:35:48

鸿蒙ArkUI应用开发

2010-02-04 10:19:39

C++多线程

2010-02-26 09:25:02

Python开发语言

2009-11-26 14:16:06

Java 7

2009-08-21 08:59:35

C#语言规范

2009-08-21 08:52:40

C#语言命名

2011-03-17 17:19:24

iptables

2011-09-26 10:50:16

JavaScript

2022-12-05 09:32:29

Go 语言风格规范

2022-11-28 08:15:14

Go语言代码

2022-05-09 10:36:05

PythonPyScript开发者

2011-03-29 10:41:51

Java线程安全

2022-04-26 18:08:21

C语言代码编程规范

2010-03-16 16:34:06

Java编程语言

2020-04-16 21:02:35

前端命名规范html规范

2014-08-05 09:53:01

PHPPHP规范

2021-11-11 15:12:21

C语言线程代码

2011-06-21 08:56:19

IOjdk6
点赞
收藏

51CTO技术栈公众号