这篇文章主要围绕Java并发编程:JavaThread方法join的简单总结和java并发编程深度解析展开,旨在为您提供一份详细的参考资料。我们将全面介绍Java并发编程:JavaThread方法jo
这篇文章主要围绕Java并发编程:Java Thread方法join的简单总结和java并发编程深度解析展开,旨在为您提供一份详细的参考资料。我们将全面介绍Java并发编程:Java Thread方法join的简单总结的优缺点,解答java并发编程深度解析的相关问题,同时也会为您带来Java JNDI 与其他 Java 技术的协作:揭秘 Java JNDI 与 Java EE 等技术的融合、Java JNDI 与其他 Java 框架的兼容性:解析 Java JNDI 与其他 Java 框架的兼容性和协作、java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结、Java 技术体系 ------JDK、 JRE、 Java ME 、 Java SE 、Java EE的实用方法。
本文目录一览:- Java并发编程:Java Thread方法join的简单总结(java并发编程深度解析)
- Java JNDI 与其他 Java 技术的协作:揭秘 Java JNDI 与 Java EE 等技术的融合
- Java JNDI 与其他 Java 框架的兼容性:解析 Java JNDI 与其他 Java 框架的兼容性和协作
- java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结
- Java 技术体系 ------JDK、 JRE、 Java ME 、 Java SE 、Java EE
Java并发编程:Java Thread方法join的简单总结(java并发编程深度解析)
一、作用
Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。具体看代码:

public class JoinTest {
public static void main(String [] args) throws InterruptedException {
ThreadJoinTest t1 = new ThreadJoinTest("小明");
ThreadJoinTest t2 = new ThreadJoinTest("小东");
t1.start();
/**join的意思是使得放弃当前线程的执行,并返回对应的线程,例如下面代码的意思就是:
程序在main线程中调用t1线程的join方法,则main线程放弃cpu控制权,并返回t1线程继续执行直到线程t1执行完毕
所以结果是t1线程执行完后,才到主线程执行,相当于在main线程中同步t1线程,t1执行完了,main线程才有执行的机会
*/
t1.join();
t2.start();
}
}
class ThreadJoinTest extends Thread{
public ThreadJoinTest(String name){
super(name);
}
@Override
public void run(){
for(int i=0;i<1000;i++){
System.out.println(this.getName() + ":" + i);
}
}
}

上面程序结果是先打印完小明线程,在打印小东线程;
上面注释也大概说明了join方法的作用:在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。注意,这里调用的join方法是没有传参的,join方法其实也可以传递一个参数给它的,具体看下面的简单例子:

public class JoinTest {
public static void main(String [] args) throws InterruptedException {
ThreadJoinTest t1 = new ThreadJoinTest("小明");
ThreadJoinTest t2 = new ThreadJoinTest("小东");
t1.start();
/**join方法可以传递参数,join(10)表示main线程会等待t1线程10毫秒,10毫秒过去后,
* main线程和t1线程之间执行顺序由串行执行变为普通的并行执行
*/
t1.join(10);
t2.start();
}
}
class ThreadJoinTest extends Thread{
public ThreadJoinTest(String name){
super(name);
}
@Override
public void run(){
for(int i=0;i<1000;i++){
System.out.println(this.getName() + ":" + i);
}
}
}

上面代码结果是:程序执行前面10毫秒内打印的都是小明线程,10毫秒后,小明和小东程序交替打印。
所以,join方法中如果传入参数,则表示这样的意思:如果A线程中掉用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行。需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。
二、join与start调用顺序问题
上面的讨论大概知道了join的作用了,那么,入股 join在start前调用,会出现什么后果呢?先看下面的测试结果

public class JoinTest {
public static void main(String [] args) throws InterruptedException {
ThreadJoinTest t1 = new ThreadJoinTest("小明");
ThreadJoinTest t2 = new ThreadJoinTest("小东");
/**join方法可以在start方法前调用时,并不能起到同步的作用
*/
t1.join();
t1.start();
//Thread.yield();
t2.start();
}
}
class ThreadJoinTest extends Thread{
public ThreadJoinTest(String name){
super(name);
}
@Override
public void run(){
for(int i=0;i<1000;i++){
System.out.println(this.getName() + ":" + i);
}
}
}

上面代码执行结果是:小明和小东线程交替打印。
所以得到以下结论:join方法必须在线程start方法调用之后调用才有意义。这个也很容易理解:如果一个线程都没有start,那它也就无法同步了。
三、join方法实现原理
有了上面的例子,我们大概知道join方法的作用了,那么,join方法实现的原理是什么呢?
其实,join方法是通过调用线程的wait方法来达到同步的目的的。例如,A线程中调用了B线程的join方法,则相当于A线程调用了B线程的wait方法,在调用了B线程的wait方法后,A线程就会进入阻塞状态,具体看下面的源码:

public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}

从源码中可以看到:join方法的原理就是调用相应线程的wait方法进行等待操作的,例如A线程中调用了B线程的join方法,则相当于在A线程中调用了B线程的wait方法,当B线程执行完(或者到达等待时间),B线程会自动调用自身的notifyAll方法唤醒A线程,从而达到同步的目的。
Java JNDI 与其他 Java 技术的协作:揭秘 Java JNDI 与 Java EE 等技术的融合
Java JNDI 简介
Java JNDI(Java Naming and Directory Interface)是Java中用于访问命名和目录服务的API,与Java EE等技术的协作至关重要。在实际开发中,Java JNDI可以与Java EE框架无缝融合,为应用程序提供更灵活的资源访问方式。本文将深入探讨Java JNDI与其他Java技术的协作,揭示它们之间的关联与互补,帮助开发者更好地理解和应用这些技术。
Java JNDI 与 Java EE 的协作
Java JNDI与Java EE有着密切的协作,在Java EE应用程序中扮演着重要的角色。Java EE规范中定义了JNDI作为标准的命名和目录服务API,Java EE应用程序可以通过JNDI来访问各种命名和目录服务中的数据。
JNDI在Java EE中的应用
在Java EE应用程序中,JNDI主要用于以下几个方面:
- 资源查找: Java EE应用程序可以使用JNDI来查找各种资源,如数据源、消息队列、EJB组件等。这些资源通常由应用程序服务器管理,Java EE应用程序可以通过JNDI来访问这些资源,而无需关心资源的具体位置和访问方式。
- 服务发现: Java EE应用程序可以使用JNDI来发现其他服务,如WEB服务、EJB组件等。这些服务通常由应用程序服务器注册,Java EE应用程序可以通过JNDI来查找这些服务,并与之通信。
- 命名空间管理: Java EE应用程序可以使用JNDI来管理命名空间,如全局JNDI命名空间和Web应用程序JNDI命名空间等。Java EE应用程序可以通过JNDI来创建、修改和删除命名空间中的对象,并访问命名空间中的对象。
Java JNDI与Java EE的集成
Java JNDI与Java EE的集成主要通过以下几个方面来实现:
立即学习“Java免费学习笔记(深入)”;
- Java EE应用程序服务器: Java EE应用程序服务器通常提供了一个JNDI服务,用于管理命名空间和资源。Java EE应用程序可以通过JNDI服务来查找资源和服务。
- Java EE规范: Java EE规范中定义了JNDI作为标准的命名和目录服务API。Java EE应用程序可以使用JNDI来访问各种命名和目录服务中的数据。
- JNDI API: Java JNDI API提供了一组丰富的类和接口,用于访问命名和目录服务中的数据。Java EE应用程序可以通过JNDI API来实现资源查找、服务发现和命名空间管理等功能。
Java JNDI 与其他 Java 技术的协作
除了Java EE之外,Java JNDI还与其他Java技术有着密切的协作,如Java RMI、Java CORBA、Java Servlet等。
Java JNDI与Java RMI的协作
Java JNDI与Java RMI(Remote Method Invocation)协作,使Java程序能够通过网络调用远程对象的方法。Java RMI中,远程对象可以注册到JNDI命名空间中,其他Java程序可以通过JNDI来查找远程对象,并调用远程对象的方法。
Java JNDI 与 Java CORBA 的协作
Java JNDI 与 Java CORBA(Common Object Request Broker Architecture)协作,使Java程序能够与其他语言(如c++、C#等)编写的 CORBA 对象进行通信。Java CORBA 对象可以注册到 JNDI 命名空间中,其他 Java 程序或其他语言编写的 CORBA 程序可以通过 JNDI 来查找 CORBA 对象,并调用 CORBA 对象的方法。
Java JNDI 与 Java Servlet 的协作
Java JNDI 与 Java Servlet 协作,使 Servlet 能够访问各种资源,如数据源、消息队列等。Servlet 可以通过 JNDI 来查找资源,并使用这些资源。
总结
Java JNDI 作为 Java 平台上通用的命名和目录服务 API,不仅与 Java EE 有着密切的协作,还与其他 Java 技术(如 Java RMI、Java CORBA、Java Servlet 等)有着密切的协作。在项目开发中,Java JNDI 发挥着重要的作用,帮助 Java 程序员轻松地访问和操纵命名和目录服务中的数据,实现资源查找、服务发现和命名空间管理等功能。
以上就是Java JNDI 与其他 Java 技术的协作:揭秘 Java JNDI 与 Java EE 等技术的融合的详细内容,更多请关注php中文网其它相关文章!
Java JNDI 与其他 Java 框架的兼容性:解析 Java JNDI 与其他 Java 框架的兼容性和协作
Java JNDI 作为 Java 开发中常用的技术,与其他 Java 框架的兼容性一直备受关注。本文从实际应用出发,深入解析了 Java JNDI 与其他 Java 框架的兼容性及协作方式,为开发者提供了全面的指导和解决方案。通过分析不同框架之间的特点和使用方法,帮助开发者更好地理解和运用 Java JNDI 技术,提升开发效率和代码质量。
- 名称空间集成: JNDI 提供了一个统一的名称空间视图,允许开发人员使用 JNDI 名称来访问各种命名和目录服务中的对象。这使得开发人员能够轻松地将应用程序连接到多个命名和目录服务,而无需担心底层技术细节。
- 命名服务集成: JNDI 提供了一个统一的接口来访问各种命名服务,例如 LDAP、DNS 和 RMI 注册表。这使得开发人员能够轻松地将应用程序连接到多个命名服务,而无需担心底层的技术细节。
- 目录服务集成: JNDI 提供了一个统一的接口来访问各种目录服务,例如 LDAP 和 Active Directory。这使得开发人员能够轻松地将应用程序连接到多个目录服务,而无需担心底层的技术细节。
- 命名对象集成: JNDI 提供了一个统一的接口来访问各种命名对象,例如文件、数据库表和 Java 对象。这使得开发人员能够轻松地将应用程序连接到多个命名对象,而无需担心底层的技术细节。
- 安全集成: JNDI 提供了一个统一的接口来访问各种安全服务,例如认证和授权。这使得开发人员能够轻松地将应用程序连接到多个安全服务,而无需担心底层的技术细节。
以下是一些演示代码,展示了 JNDI 如何与其他 Java 框架集成:
JNDI 与 LDAP 的集成
import javax.naming.Context; import javax.naming.InitialContext; public class JndiLdapExample { public static void main(String[] args) { try { // Create a JNDI context Context context = new InitialContext(); // Look up the LDAP server Context ldapContext = (Context) context.lookup("ldap://localhost:389"); // Search the LDAP server for a user String searchFilter = "(cn=John Doe)"; NamingEnumeration<SearchResult> searchResults = ldapContext.search("", searchFilter, null); // Print the results of the search while (searchResults.hasMore()) { SearchResult searchResult = searchResults.next(); System.out.println(searchResult.getName()); } } catch (NamingException e) { e.printStackTrace(); } } }
JNDI 与 DNS 的集成
立即学习“Java免费学习笔记(深入)”;
import javax.naming.Context; import javax.naming.InitialContext; public class JndiDnsExample { public static void main(String[] args) { try { // Create a JNDI context Context context = new InitialContext(); // Look up the DNS server Context dnsContext = (Context) context.lookup("dns://localhost:53"); // Resolve a hostname to an IP address String hostname = "www.example.com"; String ipAddress = dnsContext.resolve(hostname).toString(); // Print the IP address System.out.println(ipAddress); } catch (NamingException e) { e.printStackTrace(); } } }
JNDI 与 RMI 的集成
import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Reference; import java.rmi.Remote; public class JndiRmiExample { public static void main(String[] args) { try { // Create a JNDI context Context context = new InitialContext(); // Create a reference to the RMI object Reference reference = new Reference(Remote.class.getName(), "com.example.rmi.RemoteImpl", null); // Bind the reference to the JNDI context context.bind("rmi://localhost:1099/Remote", reference); // Look up the RMI object from the JNDI context Remote remoteObject = (Remote) context.lookup("rmi://localhost:1099/Remote"); // Invoke a method on the RMI object String result = remoteObject.toString(); // Print the result System.out.println(result); } catch (NamingException e) { e.printStackTrace(); } } }
JNDI 与其他 Java 框架的兼容性和协作是其成功的关键因素之一。它使开发人员能够轻松地将应用程序连接到各种命名和目录服务,并利用这些服务的特性和功能来构建强大的、可扩展的应用程序。
以上就是Java JNDI 与其他 Java 框架的兼容性:解析 Java JNDI 与其他 Java 框架的兼容性和协作的详细内容,更多请关注php中文网其它相关文章!
java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结
在 web 开发中,避免不了对日期的操作,就几种常见的日期操作做个总结 (部分参考网络,在此表示感谢):
java.util.Date、Java.util.Calendar、java.sql.Date、java.sql.Time、java.sql.Timestamp
java.lang.Object
....|__java.util.Date
..........|__java.sql.Date/java.sql.Timestamp /java.sql.Time
....|__java.security.Timestamp
java.util.Date 日期格式为:年月日时分秒
java.sql.Date 日期格式为:年月日 [只存储日期数据不存储时间数据]
java.sql.Time 日期格式为:时分秒
java.sql.Timestamp 日期格式为:年月日时分秒纳秒(毫微秒)
关系:
java.util.Date 这个类是 java.sql.Date, java.sql.Time, java.slq.Timestamp 这三个类的父类。这三个类对 java.util.Date 类进行了包装。
联系:
java.sql.Date 类屏蔽了 java.util.Date 类的时间有关的方法(形如:hh:mm:ss), 因此,不可以通过这个类访问时间有关的信息,比如,如果你通过 sqlDate.getHour () 方法去访问小时信息,此方法会抛出一个 IllegalArgumentException
异常。这是因为java.sql.Date在继承java.util.Date类的时候对父类进行了重写,禁用了时间访问的方法。之所以这么处理,是为了和数据库的Date数据类型相匹配,数据库的Date数据类行只是保存日期有关的字段。
Java.sql.Time 类屏蔽了 java.util.Date 的日期有关的字段(形如:yyyy-MM-dd), 因此,不能通过这个类访问日期有关的信息,比如:如果你通过 sqlTime.getYear () 方法去获取年有关的信息,此方法会抛出一个 IllegalArgumentException
异常。这是因为java.sql.Time在继承java.util.Date类的时候对父类进行了重写,禁用了日期访问的方法。之所以这么处理,是为了和数据库的Time数据类型相匹配,数据库的Time数据类行只是保存时间有关的字段。
Java.sql.Timestamp
字段则对java.util.Date这个类进行了扩充,它在java.util.Date类的基础上增加了毫秒的时间访问控制,因此,你可以通过
getNanos()方法去获取时间的毫微秒数(注意此处获取的时间是以毫微秒为单位的,1 秒等于十亿毫微秒),同样的,这也是为了和数据库中的 Timestamp 数据类型进行匹配。
理清了上述四个类的关系,那么 java.util.Date 和 java.util.Calendar 类有什么关系呢?
Java.util.Calendar 类是 java.util.Date 类的一个更加深入,更加全面的替代。Java.util.Calendar 类支持 java.util.Date 的所有功能,此外,Calendar 还引入了多语言,多区域的特性,可以根据需要获取不同区域,不同时区的时间,Calendar 还增加了比 Date 更加方便和快捷的许多操作,如获取一年当中的第几个星期,各个月的天数等便捷的方法。
注意:
Java.util.Calendar 区别与 java.util.Date 的几个地方也需要注意一下:首先,Calendar 增加了毫秒的时间段,通过它可以获取时间点的毫秒值,而 java.util.Date 只是精确到秒。其次,Calendar 过去年的时候是当前年份比如:2010,而 Date 获取年份的时获取到的是当前年份 - 1900 的一个值(2010-1900=110,因此,你调用 getYear 后过去的值就是 110)。最后 Calendar 是一个抽象类,之所以能够实例化,是因为此处的 Calendar 充当了一个类似于工厂的作用,在 getInstance 方法中实例化了 Calendar 子类 GregorianCalendar,并把它返回给用户使用。
针对不同的数据库选用不同的日期类型
・Oracle 的 Date 类型,只需要年月日,选择使用 java.sql.Date 类型
・MS Sqlserver 数据库的 DateTime 类型,需要年月日时分秒,选择 java.sql.Timestamp 类型
String 日期格式转换成 Date 日期格式
//java.util.Date 时间格式的转换
SimpleDateFormat f_utilDate=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String str="2011-5-31 14:40:50";
try {
java.util.Date utilDate=f_utilDate.parse(str);
System.out.println(f_utilDate.format(utilDate));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//java.sql.Date 时间格式的转换
SimpleDateFormat f_sqlDate=new SimpleDateFormat("yyyy-MM-dd");
java.sql.Date sqlDate = java.sql.Date.valueOf("2010-08-20");
System.out.println(f_sqlDate.format(sqlDate));
//java.sql.Time sqltime 时间格式的转换
SimpleDateFormat f_sqlTime=new SimpleDateFormat("hh:mm:ss");
java.sql.Time sqltime = java.sql.Time.valueOf("13:44:53");
System.out.println(f_sqlTime.format(sqltime));
//java.sql.Timestamp 时间格式的转换
SimpleDateFormat f_timestamp=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2010-08-20 14:06:27.186");
System.out.println(f_timestamp.format(timestamp));
//java.util.Date 转换成 java.sql.Date 格式
try{
SimpleDateFormat DateFormate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
java.util.Date date1 = DateFormate.parse("2011-5-31 14:40:50");
java.sql.Date sqlDate = new java.sql.Date(date1.getTime());
System.out.println(DateFormate.format(sqlDate));
}catch (Exception ex) {
System.out.println(ex.getMessage());
}
//java.sql.Date 转换成 java.util.Date 格式
java.sql.Date sqlDate1=java.sql.Date.valueOf("2005-12-12");
java.util.Date utilDate1=new java.util.Date(sqlDate1.getTime());
System.out.println ("java.sql.Date 转换成 java.util.Date 格式:"+f.format (utilDate1));
//java.util.Date 转换 java.sql.Timestamp
new java.sql.Timestamp (new java.util.Date ().getTime ());// 此处 IDE 报错
//java.util.Date 转换 java.sql.Time
new java.sql.Time(new java.util.Date().getTime());
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
我们可以使用 DateFormat 处理字符串来定义时间日期的格式
注:String 都是先转换为 java.util.Date,然后再转换成所需的格式
try{
String dateString = "2010-08-20 12:00:00.125";
DateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd kk:mm:ss.SSS",Locale.ENGLISH);// 设定格式
dateFormat.setLenient(false);
java.util.Date utilDate = dateFormat.parse (dateString);//util 类型
java.sql.Timestamp dateTime = new java.sql.Timestamp (utilDate.getTime ());//Timestamp 类型,timeDate.getTime () 返回一个 long 型
System.out.println(dateTime);
}catch(Exception ex){
ex.printStackTrace();
}
Java MySQL 数据类型对照
类型名称 | 显示长度 | 数据库类型 | JAVA 类型 | JDBC 类型索引 (int) | 描述 |
VARCHAR | L+N | VARCHAR | java.lang.String | 12 | |
CHAR | N | CHAR | java.lang.String | 1 | |
BLOB | L+N | BLOB | java.lang.byte[] | -4 | |
TEXT | 65535 | VARCHAR | java.lang.String | -1 | |
INTEGER | 4 | INTEGER UNSIGNED | java.lang.Long | 4 | |
TINYINT | 3 | TINYINT UNSIGNED | java.lang.Integer | -6 | |
SMALLINT | 5 | SMALLINT UNSIGNED | java.lang.Integer | 5 | |
MEDIUMINT | 8 | MEDIUMINT UNSIGNED | java.lang.Integer | 4 | |
BIT | 1 | BIT | java.lang.Boolean | -7 | |
BIGINT | 20 | BIGINT UNSIGNED | java.math.BigInteger | -5 | |
FLOAT | 4+8 | FLOAT | java.lang.Float | 7 | |
DOUBLE | 22 | DOUBLE | java.lang.Double | 8 | |
DECIMAL | 11 | DECIMAL | java.math.BigDecimal | 3 | |
BOOLEAN | 1 | 同 TINYINT | |||
ID | 11 | PK (INTEGER UNSIGNED) | java.lang.Long | 4 | |
DATE | 10 | DATE | java.sql.Date | 91 | |
TIME | 8 | TIME | java.sql.Time | 92 | |
DATETIME | 19 | DATETIME | java.sql.Timestamp | 93 | |
TIMESTAMP | 19 | TIMESTAMP | java.sql.Timestamp | 93 | |
YEAR | 4 | YEAR | java.sql.Date | 91 |
对于 bolb,一般用于对图片的数据库存储,原理是把图片打成二进制,然后进行的一种存储方式,在 java 中对应 byte[]数组。
对 Boolean 类型的解释
mysql 不支持 bool 类型。
1 2 3 4 5 |
|
这样可以创建成功,但检查表结构会发现 mysql 把它替换成 tinyint (1)。
即当把一个数据设置成 bool 类型的时候,数据库会自动转换成 tinyint (1) 的数据类型,其实这个就是变相的 bool。 默认值也就是 1,0 两种,分别对应了 bool 的 true 和 false
在 Java 对应的 POJO 类中,可以根据实际情况使用 java.lang.Boolean 或者 java.lang.Integer。
转自:
http://langgufu.iteye.com/blog/2202744
https://yq.aliyun.com/articles/38115
Java 技术体系 ------JDK、 JRE、 Java ME 、 Java SE 、Java EE
以下内容并非原创,来自于深入理解 Java 虚拟机一书:
从广义上讲,Clojure、JRuby、Groovy 等运行与 Java 虚拟机上的语言机器相关的程序都属于 Java 技术体系中的一员,但是仅从传统意义上来看,Sun 官方所定义的 Java 技术体系包括:
- Java 程序设计语言
- JavaAPI 类库
- 运行于各个硬件平台上的虚拟机
- Class 文件格式
- 商业机构和开源社区的第三方 Java 类库
JDK:
包括 Java 程序设计语言、JavaAPI 类库、运行于各个硬件平台上的虚拟机,JDK 是用于支持 Java 程序开发的最小环境;
JRE:
Java API 类库中的 Java SE API 子集和 Java 虚拟机这两部分统称为 JRE,JRE 是支持 Java 程序运行的标准环境。
JRE 与 JDK 的区别:
- JRE 顾名思义是 java 运行时环境,包含了 java 虚拟机,java 基础类库。是使用 java 语言编写的程序运行所需要的软件环境,是提供给想运行 java 程序的用户使用的。
- JDK 顾名思义是 java 开发工具包,是程序员使用 java 语言编写 java 程序所需的开发工具包,是提供给程序员使用的。JDK 包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具:jconsole,jvisualvm 等工具软件,还包含了 java 程序编写所需的文档和 demo 例子程序。
如果你需要运行 java 程序,只需安装 JRE 就可以了。如果你需要编写 java 程序,需要安装 JDK。
JRE 根据不同操作系统(如:windows,linux 等)和不同 JRE 提供商(IBM,ORACLE 等)有很多版本,最常用的是 Oracle 公司收购 SUN 公司的 JRE 版本。
如下所示是 Java 技术体系,及 JDK JRE 所涵盖的范围:
以上是根据各个组成部分的功能来进行划分的,如果按照技术所服务的领域来划分,或者说按照 Java 技术关注的重点业务领域来划分,Java 技术体系可以分为 4 个平台:
Java Card:
支持一些 Java 小程序(Applet)运行在小内存设备(如智能卡)上的平台。
Java ME:
支持 Java 程序运行在移动终端(手机、PDA)上的平台,对 Java API 有所精简,并加入了针对移动终端的支持,这个版本以前称为 J2ME。
Java SE:
支持面向桌面级应用的 JAVA 平台,提供了完整的 Java 核心 API,这个版本以前称为 J2SE。
Java EE:
支持使用多层架构的企业应用(如 ERP、CRM 应用)的 Java 平台,除了提供 Java SE API 外,还对其做了大量的扩充,并提供了相关的部署支持,这个版本以前称为 J2EE。
关于Java并发编程:Java Thread方法join的简单总结和java并发编程深度解析的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Java JNDI 与其他 Java 技术的协作:揭秘 Java JNDI 与 Java EE 等技术的融合、Java JNDI 与其他 Java 框架的兼容性:解析 Java JNDI 与其他 Java 框架的兼容性和协作、java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结、Java 技术体系 ------JDK、 JRE、 Java ME 、 Java SE 、Java EE等相关知识的信息别忘了在本站进行查找喔。
本文标签: