当前位置:首页 » 操作系统 » java包源码

java包源码

发布时间: 2022-09-18 08:01:17

‘壹’ java中的jar包是写好的类那么为什么查看时需要导入源码

在Eclipse查看开发包jar源码的方法如下:

  1. 选择项目,右键中单击【Properties】

  2. 2.【Java Build Path】-【Configure Build Path】-【Libraries】,在下面找到如:Guava-r09.jar包,展开它,选择【Source attachment】,单击右边的【Edit…】按钮。

  3. 3.在打开的窗口中,可选择文件(jarzip),目录或工作空间中的jar文件,在这里我选择External Folder…,选择如E:/java project/guava即可。

4.连续单击【OK】两次回到Eclipse工作即可。


有源码,把它加到eclipse中:


方法1:直接用压缩打开相应的jar包,然后把源码拖进去压缩一下,最后选中工程刷新一下ok。


方法2:右击referenced

libraries中需要导入源代码的包,右击properties->java source

attatchment,根据你源文件格式(源码可以是直接src文件夹,也可以是压缩成zip或jar后的压缩文件)在右边选择合适的方式,最后点击

ok。


至于如何源码打进jar包,在eclipse中打jar包的时候有个“Export

java source files and

resources”选项,选中它打包就ok;也可以如方法1那样,用eclipse生成一般jar包之后,用压缩把src文件夹压进去。

‘贰’ 如何在eclipse中看jar包源代码

在Eclipse查看开发包jar源码的方法如下:

  1. 选择项目,右键中单击【Properties】

2.【Java Build Path】-【Configure Build Path】-【Libraries】,在下面找到如:Guava-r09.jar包,展开它,选择【Source attachment】,单击右边的【Edit…】按钮。

3.在打开的窗口中,可选择文件(jarzip),目录或工作空间中的jar文件,在这里我选择External Folder…,选择如E:/java project/guava即可。


4.连续单击【OK】两次回到Eclipse工作平台即可。

‘叁’ java并发包源码怎么读

1. 各种同步控制工具的使用

1.1 ReentrantLock

ReentrantLock感觉上是synchronized的增强版,synchronized的特点是使用简单,一切交给JVM去处理,但是功能上是比较薄弱的。在JDK1.5之前,ReentrantLock的性能要好于synchronized,由于对JVM进行了优化,现在的JDK版本中,两者性能是不相上下的。如果是简单的实现,不要刻意去使用ReentrantLock。

相比于synchronized,ReentrantLock在功能上更加丰富,它具有可重入、可中断、可限时、公平锁等特点。

首先我们通过一个例子来说明ReentrantLock最初步的用法:

package test;

import java.util.concurrent.locks.ReentrantLock;public class Test implements Runnable{ public static ReentrantLock lock = new ReentrantLock(); public static int i = 0;

@Override public void run() { for (int j = 0; j < 10000000; j++)
{ lock.lock(); try
{
i++;
} finally
{ lock.unlock();
}
}
}
public static void main(String[] args) throws InterruptedException {
Test test = new Test();
Thread t1 = new Thread(test);
Thread t2 = new Thread(test);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(i);
}

}

有两个线程都对i进行++操作,为了保证线程安全,使用了ReentrantLock,从用法上可以看出,与synchronized相比,ReentrantLock就稍微复杂一点。因为必须在finally中进行解锁操作,如果不在finally解锁,有可能代码出现异常锁没被释放,而synchronized是由JVM来释放锁。

那么ReentrantLock到底有哪些优秀的特点呢?

1.1.1 可重入

单线程可以重复进入,但要重复退出

lock.lock();
lock.lock();try{
i++;

}
finally{
lock.unlock();
lock.unlock();
}

由于ReentrantLock是重入锁,所以可以反复得到相同的一把锁,它有一个与锁相关的获取计数器,如果拥有锁的某个线程再次得到锁,那么获取计数器就加1,然后锁需要被释放两次才能获得真正释放(重入锁)。这模仿了synchronized的语义;如果线程进入由线程已经拥有的监控器保护的 synchronized 块,就允许线程继续进行,当线程退出第二个(或者后续)synchronized块的时候,不释放锁,只有线程退出它进入的监控器保护的第一个synchronized块时,才释放锁。

public class Child extends Father implements Runnable{ final static Child child = new Child();//为了保证锁唯一
public static void main(String[] args) { for (int i = 0; i < 50; i++) { new Thread(child).start();
}
}
public synchronized void doSomething() {
System.out.println("1child.doSomething()");
doAnotherThing(); // 调用自己类中其他的synchronized方法
}
private synchronized void doAnotherThing() { super.doSomething(); // 调用父类的synchronized方法
System.out.println("3child.doAnotherThing()");
}
@Override
public void run() {
child.doSomething();
}
}class Father { public synchronized void doSomething() {
System.out.println("2father.doSomething()");
}
}

我们可以看到一个线程进入不同的synchronized方法,是不会释放之前得到的锁的。所以输出还是顺序输出。所以synchronized也是重入锁

输出:

1child.doSomething()
2father.doSomething()
3child.doAnotherThing()
1child.doSomething()
2father.doSomething()
3child.doAnotherThing()
1child.doSomething()
2father.doSomething()
3child.doAnotherThing()
...

1.1.2.可中断

与synchronized不同的是,ReentrantLock对中断是有响应的。中断相关知识查看[高并发Java 二] 多线程基础

普通的lock.lock()是不能响应中断的,lock.lockInterruptibly()能够响应中断。

我们模拟出一个死锁现场,然后用中断来处理死锁

package test;import java.lang.management.ManagementFactory;import java.lang.management.ThreadInfo;import java.lang.management.ThreadMXBean;import java.util.concurrent.locks.ReentrantLock;public class Test implements Runnable{ public static ReentrantLock lock1 = new ReentrantLock(); public static ReentrantLock lock2 = new ReentrantLock(); int lock; public Test(int lock)
{ this.lock = lock;
} @Override
public void run()
{ try
{ if (lock == 1)
{
lock1.lockInterruptibly(); try
{
Thread.sleep(500);
} catch (Exception e)
{ // TODO: handle exception
}
lock2.lockInterruptibly();
} else
{
lock2.lockInterruptibly(); try
{
Thread.sleep(500);
} catch (Exception e)
{ // TODO: handle exception
}
lock1.lockInterruptibly();
}
} catch (Exception e)
{ // TODO: handle exception
} finally
{ if (lock1.isHeldByCurrentThread())
{
lock1.unlock();
} if (lock2.isHeldByCurrentThread())
{
lock2.unlock();
}
System.out.println(Thread.currentThread().getId() + ":线程退出");
}
} public static void main(String[] args) throws InterruptedException {
Test t1 = new Test(1);
Test t2 = new Test(2);
Thread thread1 = new Thread(t1);
Thread thread2 = new Thread(t2);
thread1.start();
thread2.start();
Thread.sleep(1000); //DeadlockChecker.check();
} static class DeadlockChecker
{ private final static ThreadMXBean mbean = ManagementFactory
.getThreadMXBean(); final static Runnable deadlockChecker = new Runnable()
{ @Override
public void run()
{ // TODO Auto-generated method stub
while (true)
{ long[] deadlockedThreadIds = mbean.findDeadlockedThreads(); if (deadlockedThreadIds != null)
{
ThreadInfo[] threadInfos = mbean.getThreadInfo(deadlockedThreadIds); for (Thread t : Thread.getAllStackTraces().keySet())
{ for (int i = 0; i < threadInfos.length; i++)
{ if(t.getId() == threadInfos[i].getThreadId())
{
t.interrupt();
}
}
}
} try
{
Thread.sleep(5000);
} catch (Exception e)
{ // TODO: handle exception
}
}

}
};
public static void check()
{
Thread t = new Thread(deadlockChecker);
t.setDaemon(true);
t.start();
}
}

}

上述代码有可能会发生死锁,线程1得到lock1,线程2得到lock2,然后彼此又想获得对方的锁。

我们用jstack查看运行上述代码后的情况

下面举个例子:

package test;import java.util.concurrent.CyclicBarrier;public class Test implements Runnable{ private String soldier; private final CyclicBarrier cyclic; public Test(String soldier, CyclicBarrier cyclic)
{ this.soldier = soldier; this.cyclic = cyclic;
} @Override
public void run()
{ try
{ //等待所有士兵到齐
cyclic.await();
dowork(); //等待所有士兵完成工作
cyclic.await();
} catch (Exception e)
{ // TODO Auto-generated catch block
e.printStackTrace();
}

} private void dowork()
{ // TODO Auto-generated method stub
try
{
Thread.sleep(3000);
} catch (Exception e)
{ // TODO: handle exception
}
System.out.println(soldier + ": done");
} public static class BarrierRun implements Runnable
{ boolean flag; int n; public BarrierRun(boolean flag, int n)
{ super(); this.flag = flag; this.n = n;
} @Override
public void run()
{ if (flag)
{
System.out.println(n + "个任务完成");
} else
{
System.out.println(n + "个集合完成");
flag = true;
}

}

} public static void main(String[] args)
{ final int n = 10;
Thread[] threads = new Thread[n]; boolean flag = false;
CyclicBarrier barrier = new CyclicBarrier(n, new BarrierRun(flag, n));
System.out.println("集合"); for (int i = 0; i < n; i++)
{
System.out.println(i + "报道");
threads[i] = new Thread(new Test("士兵" + i, barrier));
threads[i].start();
}
}

}

打印结果:

集合

士兵5: done士兵7: done士兵8: done士兵3: done士兵4: done士兵1: done士兵6: done士兵2: done士兵0: done士兵9: done10个任务完成

1.7 LockSupport

提供线程阻塞原语

和suspend类似

LockSupport.park();
LockSupport.unpark(t1);

与suspend相比不容易引起线程冻结

LockSupport的思想呢,和Semaphore有点相似,内部有一个许可,park的时候拿掉这个许可,unpark的时候申请这个许可。所以如果unpark在park之前,是不会发生线程冻结的。

下面的代码是[高并发Java 二] 多线程基础中suspend示例代码,在使用suspend时会发生死锁。

而使用LockSupport则不会发生死锁。

另外

park()能够响应中断,但不抛出异常。中断响应的结果是,park()函数的返回,可以从Thread.interrupted()得到中断标志。

在JDK当中有大量地方使用到了park,当然LockSupport的实现也是使用unsafe.park()来实现的。

public static void park() { unsafe.park(false, 0L);
}

1.8 ReentrantLock 的实现

下面来介绍下ReentrantLock的实现,ReentrantLock的实现主要由3部分组成:

  • CAS状态

  • 等待队列

  • park()

  • ReentrantLock的父类中会有一个state变量来表示同步的状态

  • /**

  • * The synchronization state.

  • */

  • private volatile int state;

  • 通过CAS操作来设置state来获取锁,如果设置成了1,则将锁的持有者给当前线程

  • final void lock() { if (compareAndSetState(0, 1))

  • setExclusiveOwnerThread(Thread.currentThread()); else

  • acquire(1);

  • }

  • 如果拿锁不成功,则会做一个申请

  • public final void acquire(int arg) { if (!tryAcquire(arg) &&

  • acquireQueued(addWaiter(Node.EXCLUSIVE), arg))

  • selfInterrupt();

  • }

  • 首先,再去申请下试试看tryAcquire,因为此时可能另一个线程已经释放了锁。

    如果还是没有申请到锁,就addWaiter,意思是把自己加到等待队列中去

    其间还会有多次尝试去申请锁,如果还是申请不到,就会被挂起

  • private final boolean parkAndCheckInterrupt() {

  • LockSupport.park(this); return Thread.interrupted();

  • }

  • 同理,如果在unlock操作中,就是释放了锁,然后unpark,这里就不具体讲了。

    2. 并发容器及典型源码分析

    2.1ConcurrentHashMap

    我们知道HashMap不是一个线程安全的容器,最简单的方式使HashMap变成线程安全就是使用Collections.synchronizedMap,它是对HashMap的一个包装

  • public static Map m=Collections.synchronizedMap(new HashMap());

  • 同理对于List,Set也提供了相似方法。

    但是这种方式只适合于并发量比较小的情况。

    我们来看下synchronizedMap的实现

    它会将HashMap包装在里面,然后将HashMap的每个操作都加上synchronized。

    由于每个方法都是获取同一把锁(mutex),这就意味着,put和remove等操作是互斥的,大大减少了并发量。

    下面来看下ConcurrentHashMap是如何实现的

    在ConcurrentHashMap内部有一个Segment段,它将大的HashMap切分成若干个段(小的HashMap),然后让数据在每一段上Hash,这样多个线程在不同段上的Hash操作一定是线程安全的,所以只需要同步同一个段上的线程就可以了,这样实现了锁的分离,大大增加了并发量。

    在使用ConcurrentHashMap.size时会比较麻烦,因为它要统计每个段的数据和,在这个时候,要把每一个段都加上锁,然后再做数据统计。这个就是把锁分离后的小小弊端,但是size方法应该是不会被高频率调用的方法。

    在实现上,不使用synchronized和lock.lock而是尽量使用trylock,同时在HashMap的实现上,也做了一点优化。这里就不提了。

    2.2BlockingQueue

    BlockingQueue不是一个高性能的容器。但是它是一个非常好的共享数据的容器。是典型的生产者和消费者的实现。

‘肆’ 如何把打包后的JAVA文件找出源码

不能查看源码的,现在基本都是打混淆包,不可能反编译

‘伍’ java .jar包里面存的是中间码还是源码

java包里面只有class文件.应该算是中间码

如果你是通过ide看到源码的,或许你是通过maven下载自动关联了源码,或者是ide给你反编译了

源码我们指的是java文件,你看到的是class文件,属于中间码.

如果觉得有用的话,请关注下微信公帐号:早晚程序员,定期分享java技术,源码,jvm,字节码,kafka,多线程,redis等.

‘陆’ 什么是java源代码 怎么查看

不知道你说的是浏览器的还是什么的,
如果是浏览器的那么简单找到工具-查看源代码,你就能看见代码了,
还有一个就是被编译成class文件的java用反编译工具可以看到源代码,
如果以上都不是你想要的答案,那么你所说的代码就是程序员写好的代码文件

‘柒’ Java源代码

packagecom.;

importjava.util.ArrayList;
importjava.util.List;
importjava.util.Scanner;

importstaticjava.lang.System.out;
importstaticjava.lang.System.in;
/**
*Createdbytracyon2017/10/11.
*/
publicclassLR{

staticint[]numbers;
staticList<Domain>domains=newArrayList<>();

publicstaticvoidmain(String...asd){
intm,n;
out.print("请输入数字个数N:");
n=input(1,Integer.MAX_VALUE);
out.print("请输入计算行数M:");
m=input(1,10000);
out.println("请输入"+n+"个数字,每个数字介于1跟1000000之间,用空格隔开:");
numbers=inputNumbers(n);
for(inti=0;i<m;i++){
domains.add(inputDomain(n,i+1));
}
for(Domaindomain:domains){
domain.output();
}
}

/**
*输入一个介于min跟max之间的整数
*@parammin
*@parammax
*@return
*/
privatestaticintinput(intmin,intmax){
Scannerscanner=newScanner(in);
try{
inti=scanner.nextInt();
if(i<min||i>max){
out.print("输入数字大小不符合要求,请重新输入”");
returninput(min,max);
}
returni;
}catch(Exceptione){
out.print("您输入的不是数字,请重新输入“");
returninput(min,max);
}
}

/**
*输入N个介于1到1000000之间的整数
*@paramn
*@return
*/
privatestaticint[]inputNumbers(intn){
Scannerscanner=newScanner(in);
StringnumStr=scanner.nextLine();
String[]nums=numStr.trim().split("\s+");
if(nums.length!=n){
out.println("输入数字个数不对,请重新输入:");
returninputNumbers(n);
}
int[]numbers=newint[n];
for(inti=0;i<n;i++){
try{
intnumber=Integer.valueOf(nums[i]);
if(number<1||number>10000){
out.print("输入数字大小不符合要求,请重新输入”");
numbers[i]=input(1,1000000);
}else{
numbers[i]=number;
}
}catch(NumberFormatExceptione){
out.print(String.format("您输入的%s不是数字,请重新输入:",nums[i]));
numbers[i]=input(1,1000000);
}
}
returnnumbers;
}

(intn,intindex){
out.println("请输入第"+index+"行的2个数字L,R(1<=L<=R<=%d)用空格隔开:");
Scannerscanner=newScanner(in);
StringnumStr=scanner.nextLine();
String[]nums=numStr.trim().split("\s+");
if(nums.length!=2){
out.print(String.format("输入数字个数不对,请重新输入!",n));
returninputDomain(n,index);
}
Stringls=nums[0];
Stringrs=nums[1];
try{
intl=Integer.valueOf(ls);
intr=Integer.valueOf(rs);
if(l<1||r<l||r>n){
out.print(String.format("输入数字大小不符合,请重新输入!",n));
returninputDomain(n,index);
}
returnnewDomain(l,r,index);
}catch(NumberFormatExceptione){
out.println(String.format("输入数字格式错误,请重新输入2个数字L,R(1<=L<=R<=%d)用空格隔开:",n));
returninputDomain(n,index);
}
}

privatestaticclassDomain{
intl;
intr;
intindex;

Domain(intl,intr,intindex){
this.l=l;
this.r=r;
this.index=index;
}

voidoutput(){
intresult=0;
for(inti=l-1;i<r;i++){
result+=numbers[i];
}
out.println(String.format("第%d行:第%d到第%d个数之和为:%d",index,l,r,result));
}
}
}

‘捌’ java核心源码包存放在什么目录下

在你安装的jdk的安装目录中 有个src.zip 里面都是java的核心源码。

‘玖’ JAVA源代码的扩展名为( )

JAVA源代码的扩展名为.java。

Java源程序(.java文件)-java字节码文件(.class文件)-由解释执行器(java.exe)将字节码文件加载到java虚拟机(jvm)-字节码文件(.class)就会在java虚拟机中执行。

Java的基本包

java.lang其中包含有:接口:Comparable、Cloneable、Runable等;类:八个基本数据类型封装类、Byte、Short、Integer、Long、Boolean、Character、Float、Double等。



(9)java包源码扩展阅读

Java为一个面向对象的语言。对程序员来说,这意味着要注意应中的数据和操纵数据的方法(method),而不是严格地用过程来思考。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。

类按一定体系和层次安排的,使得子类可以从超类继承行为。在这个类层次体系中有一个根类,它是具有一般行为的类。Java程序是用类来组织的。

Java还包括一个类的扩展集合,分别组成各种程序包(Package),用户可以在自己的程序中使用。

例如,Java提供产生图形用户接口部件的类(java.awt包),这里awt为抽象窗口工具集(abstract windowing toolkit)的缩写,处理输入输出的类(java.io包)和支持网络功能的类(java.net包)。

‘拾’ 怎么查看jar包里面的源码

在Eclipse查看开发包jar源码的方法如下:
1.选择项目,右键中单击【Properties】
2.【Java Build Path】-【Configure Build Path】-【Libraries】,在下面找到如:Guava-r09.jar包,展开它,选择【Source attachment】,单击右边的【Edit…】按钮。
3.在打开的窗口中,可选择文件(jar\zip),目录或工作空间中的jar文件,在这里我选择External Folder…,选择如E:/java project/guava即可。

4.连续单击【OK】两次回到Eclipse工作平台即可。
或者:
有源码,把它加到eclipse中:
方法1:直接用压缩软件打开相应的jar包,然后把源码拖进去压缩一下,最后选中工程刷新一下ok。
方法2:右击referenced libraries中需要导入源代码的包,右击properties->Java source attatchment,根据你源文件格式(源码可以是直接src文件夹,也可以是压缩成zip或jar后的压缩文件)在右边选择合适的方式,最后点击ok。
至于如何源码打进jar包,在eclipse中打jar包的时候有个“Export java source files and resources”选项,选中它打包就ok;也可以如方法1那样,用eclipse生成一般jar包之后,用压缩软件把src文件夹压进去。

热点内容
内置存储卡可以拆吗 发布:2025-05-18 04:16:35 浏览:332
编译原理课时设置 发布:2025-05-18 04:13:28 浏览:372
linux中进入ip地址服务器 发布:2025-05-18 04:11:21 浏览:607
java用什么软件写 发布:2025-05-18 03:56:19 浏览:28
linux配置vim编译c 发布:2025-05-18 03:55:07 浏览:102
砸百鬼脚本 发布:2025-05-18 03:53:34 浏览:936
安卓手机如何拍视频和苹果一样 发布:2025-05-18 03:40:47 浏览:735
为什么安卓手机连不上苹果7热点 发布:2025-05-18 03:40:13 浏览:799
网卡访问 发布:2025-05-18 03:35:04 浏览:506
接收和发送服务器地址 发布:2025-05-18 03:33:48 浏览:368