java增加_Java添加

抽象类通过内部方法,表示定义抽象类的子类对象:

abstract classStudent{//抽象类可以通过内部方法创建子类对象

public Student s1 = newStudent(){publicStudent nextOne(){return this;

}

};

}

在API中枚举类没有values()方法,但实际有这个方法的。enum声明实际上定义了一个类。因此我们可以通过定义的enum调用其方法。其次,Java编译器会自动在enum类型中插入一些方法,其中就包括values()——所以我们的程序在没编译的时候,自然没法查看values()方法的源码了。这个枚举实际上是由java.lang.Enum这个类实现的,在程序中定义的枚举类型,都会隐式继承此类。并且,由于java中的继承是单继承,所以我们定义的枚举就无法在继承其他类了。

enumDirection {

LEFT, RIGHT, UP, DOWN

}

Direction dirs[]=Direction.values();for (int i = 0; i < dirs.length; i++) {

System.out.println(dirs[i]);

}

这样就可以通过下标访问枚举值

1.java中的enum关键字背后实际是Enum这个类实现的。

2.在我们编写自定义的enum时,其中是不含values方法的,再编译java文件时,java编译器会自动帮助我们生成这个方法。

enumCar {

lamborghini(900),tata(2),audi(50),fiat(15),honda(12);private intprice;

Car(intp) {

price=p;

}intgetPrice() {returnprice;

}

}public classMain {public static voidmain(String args[]){

System.out.println("所有汽车的价格:");for(Car c : Car.values())

System.out.println(c+ " 需要 "

+ c.getPrice() + " 千美元。");

}

}

可以直接从class文件中获取指定枚举值

Gender g = Enum.valueOf(Gender.class, "FEm");

枚举类的抽象方法

enumGrade

{//实现抽象方法//隐式添加abstract

A("100-90")

{publicString localeVlaue()

{return "优";

}

},

B("89-80")

{publicString localeVlaue()

{return "良";

}

},

C("79-70")

{publicString localeVlaue()

{return "中";

}

},

D("69-60")

{publicString localeVlaue()

{return "差";

}

},

E("59-0")

{publicString localeVlaue()

{return "不及格";

}

};

//抽象方法

public abstract String localeVlaue();

然后通过枚举对象调用方法

System.out.println(Grade.A.getValue()+" 分为 "+Grade.A.localeVlaue());

System.out.println(Grade.B.getValue()+" 分为 "+Grade.B.localeVlaue());

System.out.println(Grade.C.getValue()+" 分为 "+Grade.C.localeVlaue());

System.out.println(Grade.D.getValue()+" 分为 "+Grade.D.localeVlaue());

System.out.println(Grade.E.getValue()+" 分为 "+Grade.E.localeVlaue());

//Collection collections = new HashSet();

Collection collection = new HashList();

ReflectPoint pt1 = new ReflectPoint(3,3);

ReflectPoint pt2= new ReflectPoint(5,5);

ReflectPoint pt3= new ReflectPoint(3,3);

collections.add(pt1);

collections.add(pt2);

collections.add(pt3);

collections.add(pt1);//改变了y的值,hashcode值也改了,所以这里如果调用remove()方法,是无法删掉pt1的//这叫内存泄漏//pt1.y = 7;//collections.remove(pt1);

newThread(newRunnable(){public voidrun(){//代码执行快

}

}

){public voidrun(){//代码执行

}

}.start();//这里执行的是Thread的run()方法,不是Runnable的run()方法

Thread和Runnable两种实现多线程的方式都是本质还是实现Thread类的run()方法

public classTheadRunnableTest {public static voidmain(String[] args) {newThread(newRunnable(){public voidrun() {

System.out.println("Runnable.run()方法");

}

}

){//实现的是Thread的run()方法

public voidrun() {

System.out.println("Thread.run()方法");

}

}.start();

}

}

多线程共享数据

importjava.util.HashMap;importjava.util.Map;importjava.util.Random;public classThreadScopeShareData {private static int data = 0;private static Map threadData = new HashMap();public static voidmain(String[] args) {for(int i=0;i<2;i++){new Thread(newRunnable(){

@Overridepublic voidrun() {int data = newRandom().nextInt();

System.out.println(Thread.currentThread().getName()+ " has put data :" +data);

threadData.put(Thread.currentThread(), data);newA().get();newB().get();

}

}).start();

}

}static classA{public voidget(){int data =threadData.get(Thread.currentThread());

System.out.println("A from " +Thread.currentThread().getName()+ " get data :" +data);

}

}static classB{public voidget(){int data =threadData.get(Thread.currentThread());

System.out.println("B from " +Thread.currentThread().getName()+ " get data :" +data);

}

}

}

使用ThreadLocal类实现上面程序

importjava.util.Random;public classThreadScopeShareData {private static int data = 0;private static ThreadLocal tl = new ThreadLocal();public static voidmain(String[] args) {for(int i=0;i<2;i++){new Thread(newRunnable(){

@Overridepublic voidrun() {int data = newRandom().nextInt();

System.out.println(Thread.currentThread().getName()+ " has put data :" +data);

tl.set(data);newA().get();newB().get();

}

}).start();

}

}static classA{public voidget(){int data =tl.get();

System.out.println("A from " +Thread.currentThread().getName()+ " get data :" +data);

}

}static classB{public voidget(){int data =tl.get();

System.out.println("B from " +Thread.currentThread().getName()+ " get data :" +data);

}

}

}

一个ThreadLocal只能传入一个变量,如果有多个数据就需要定义多个ThreadLocal,所以可以定义一个对象传入到ThreadLocal对象中。

importjava.util.Random;public classThreadLocalTest {private static ThreadLocal x = new ThreadLocal();private static ThreadLocal myThreadScopeData = new ThreadLocal();public static voidmain(String[] args) {for(int i=0;i<2;i++){new Thread(newRunnable(){

@Overridepublic voidrun() {int data = newRandom().nextInt();

System.out.println(Thread.currentThread().getName()+ " has put data :" +data);

x.set(data);/*MyThreadScopeData myData = new MyThreadScopeData();

myData.setName("name" + data);

myData.setAge(data);

myThreadScopeData.set(myData);*/MyThreadScopeData.getThreadInstance().setName("name" +data);

MyThreadScopeData.getThreadInstance().setAge(data);newA().get();newB().get();

}

}).start();

}

}static classA{public voidget(){int data =x.get();

System.out.println("A from " +Thread.currentThread().getName()+ " get data :" +data);/*MyThreadScopeData myData = myThreadScopeData.get();;

System.out.println("A from " + Thread.currentThread().getName()

+ " getMyData: " + myData.getName() + "," +

myData.getAge());*/MyThreadScopeData myData=MyThreadScopeData.getThreadInstance();

System.out.println("A from " +Thread.currentThread().getName()+ " getMyData: " + myData.getName() + "," +myData.getAge());

}

}static classB{public voidget(){int data =x.get();

System.out.println("B from " +Thread.currentThread().getName()+ " get data :" +data);

MyThreadScopeData myData=MyThreadScopeData.getThreadInstance();

System.out.println("B from " +Thread.currentThread().getName()+ " getMyData: " + myData.getName() + "," +myData.getAge());

}

}

}classMyThreadScopeData{privateMyThreadScopeData(){}public static /*synchronized*/MyThreadScopeData getThreadInstance(){

MyThreadScopeData instance=map.get();if(instance == null){

instance= newMyThreadScopeData();

map.set(instance);

}returninstance;

}//private static MyThreadScopeData instance = null;//new MyThreadScopeData();

private static ThreadLocal map = new ThreadLocal();privateString name;private intage;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

}

软件包 java.util.concurrent.atomic

线程池

importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.TimeUnit;public classThreadPoolTest {/***@paramargs*/

public static voidmain(String[] args) {//ExecutorService threadPool = Executors.newFixedThreadPool(3);//ExecutorService threadPool = Executors.newCachedThreadPool();

ExecutorService threadPool =Executors.newSingleThreadExecutor();for(int i=1;i<=10;i++){final int task =i;

threadPool.execute(newRunnable(){

@Overridepublic voidrun() {for(int j=1;j<=10;j++){try{

Thread.sleep(20);

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+ " is looping of " + j + " for task of " +task);

}

}

});

}

System.out.println("all of 10 tasks have committed! ");//threadPool.shutdownNow();

Executors.newScheduledThreadPool(3).scheduleAtFixedRate(newRunnable(){

@Overridepublic voidrun() {

System.out.println("bombing!");

}},6,2,

TimeUnit.SECONDS);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值