日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java编写静态工具类_Java编程中静态内部类与同步类的写法示例

發(fā)布時(shí)間:2024/9/27 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java编写静态工具类_Java编程中静态内部类与同步类的写法示例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java靜態(tài)內(nèi)部類

將某個(gè)內(nèi)部類定義為靜態(tài)類,跟將其他類定義為靜態(tài)類的方法基本相同,引用規(guī)則也基本一致。不過其細(xì)節(jié)方面仍然有很大的不同。具體來說,主要有如下幾個(gè)地方要引起各位程序開發(fā)人員的注意。

(一)一般情況下,如果一個(gè)內(nèi)部類不是被定義成靜態(tài)內(nèi)部類,那么在定義成員變量或者成員方法的時(shí)候,是不能夠被定義成靜態(tài)成員變量與靜態(tài)成員方法的。也就是說,在非靜態(tài)內(nèi)部類中不可以聲明靜態(tài)成員。

(二)一般非靜態(tài)外部類可以隨意訪問其外部類的成員變量以及方法(包括聲明為private的方法),但是如果一個(gè)內(nèi)部類被聲明為static,則其在訪問包括自身的外部類會(huì)有諸多的限制。靜態(tài)內(nèi)部類不能訪問其外部類的非靜態(tài)成員變量和方法。

(三)在一個(gè)類中創(chuàng)建非靜態(tài)成員內(nèi)部類的時(shí)候,有一個(gè)強(qiáng)制性的規(guī)定,即內(nèi)部類的實(shí)例一定要綁定在外部類的實(shí)例中。然后要在一個(gè)外部類中定義一個(gè)靜態(tài)的內(nèi)部類,不需要利用關(guān)鍵字new來創(chuàng)建內(nèi)部類的實(shí)例。即在創(chuàng)建靜態(tài)類內(nèi)部對(duì)象時(shí),不需要其外部類的對(duì)象。

java在實(shí)現(xiàn)LinkedList時(shí)使用了如下內(nèi)部類:

public class LinkedList

extends AbstractSequentialList

implements List, Deque, Cloneable, java.io.Serializable

{

........

private static class Entry {

E element;

Entry next;

Entry previous;

Entry(E element, Entry next, Entry previous) {

this.element = element;

this.next = next;

this.previous = previous;

}

}

private Entry addBefore(E e, Entry entry) {

Entry newEntry = new Entry(e, entry, entry.previous);

newEntry.previous.next = newEntry;

newEntry.next.previous = newEntry;

size++;

modCount++;

return newEntry;

}

........

}

這里即靜態(tài)內(nèi)部類的典型用法

java同步工具類

/**

* 需要啟動(dòng)多個(gè)線程把接口數(shù)據(jù)分批導(dǎo)入目標(biāo),要求

* 每次執(zhí)行的時(shí)候必須保證前一次任務(wù)已結(jié)束,處理這個(gè)需求的方式有很多種,其實(shí)質(zhì)即

* 線程間同步問題,正好這兩天我也在關(guān)注線程同步相關(guān)的東東,jdk提供了不少的線程

* 同步工具類,CountDownLatch:一個(gè)同步輔助類,在完成一組正在其他線程中執(zhí)行的

* 操作之前,它允許一個(gè)或多個(gè)線程一直等待。

* 用給定的計(jì)數(shù) 初始化 CountDownLatch。由于調(diào)用了 countDown() 方法,所以在當(dāng)前計(jì)數(shù)到達(dá)零之前,

* await 方法會(huì)一直受阻塞。之后,會(huì)釋放所有等待的線程,await 的所有后續(xù)調(diào)用都將立即返回。

* 這種現(xiàn)象只出現(xiàn)一次——計(jì)數(shù)無法被重置(這點(diǎn)很重要哦)。如果需要重置計(jì)數(shù),請(qǐng)考慮使用 CyclicBarrier。

* 下面是一個(gè)簡(jiǎn)單的例子來模擬該需求,當(dāng)然可能因?yàn)闉榱四M場(chǎng)景,會(huì)有一些不合理的地方,這里主要闡述

* CountDownLatch同步,關(guān)于CountDownLatch的源碼將在后面來分析,其主要涉及AbstractQueuedSynchronizer

* 這個(gè)類,他的類容相對(duì)比較復(fù)雜

* **/

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import java.util.concurrent.CountDownLatch;

public class Driver {

static List strList = null;

int k = 0;

static {

//模擬數(shù)據(jù)

strList = new ArrayList();

for (int i = 0; i < 50; i++) {

strList.add(i);

}

}

public static void main(String args[]) {

boolean isEnd = true;

//為了驗(yàn)證正確性,只執(zhí)行20次

int count=0;

Driver d = new Driver();

while (isEnd && strList.size() > 0&&count<20) {

CountDownLatch startSignal = new CountDownLatch(1);

final CountDownLatch doneSignal = new CountDownLatch(5);

for (int i = 0; i < 5; ++i)

{

new Thread(d.new Worker(startSignal, doneSignal,i)).start();

}

//計(jì)數(shù)減1 子線程Worker可以執(zhí)行

startSignal.countDown();

try {

new Thread(new Runnable() {

Random r = new Random();

@Override

public void run() {

try {

//主線程阻塞 知道所有子線程將doneSignal清零

doneSignal.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

while(strList.size()<=0){

int pos = r.nextInt(1000);

strList.clear();

for (int i = pos; i < pos + 50; i++) {

strList.add(i);

}

}

}

}).start();

isEnd = true;

} catch (Exception e) {

e.printStackTrace();

}

count++;

}

}

class Worker implements Runnable {

private final CountDownLatch startSignal;

private final CountDownLatch doneSignal;

private int i;

Worker(CountDownLatch startSignal, CountDownLatch doneSignal,int i) {

this.startSignal = startSignal;

this.doneSignal = doneSignal;

this.i=i;

}

public void run() {

try {

// 等待主線程執(zhí)行countDown

startSignal.await();

doWork();

//計(jì)數(shù)減1

doneSignal.countDown();

} catch (InterruptedException ex) {

} // return;

}

void doWork() {

synchronized (strList) {

int start=(i)*(50/5);

int end=(i+1)*(50/5);

for (int i = start; i < end; i++) {

System.out.println(strList.get(i) + "---" + "已被刪除");

}

}

}

}

}

總結(jié)

以上是生活随笔為你收集整理的java编写静态工具类_Java编程中静态内部类与同步类的写法示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。