做業_java基礎第九天_多線程、自動拆裝箱

1.蜜蜂和熊的生產消費關係,熊在蜂蜜滿10斤吃掉。蜜蜂一次生產一斤蜂蜜,且蜜蜂生成一斤蜂蜜花費的時間是10ms。java

  十隻蜜蜂和兩隻熊。安全

2.取出兩個字符串中最大的公共子串。ide

3.StringBuffer是線程安全的,StringBuilder不是線程安全。單線程訪問狀況下,性能是否一致?函數

4.完成8中基本數據類包裝類的練習,完成自動拆裝箱操做。性能

------------------------------做業1---------------------------------------測試

package 做業一;ui

//1.密封盒熊的生產消費關係,想在密封滿10斤的時候吃掉。密封一次生產一斤密封,且生產一斤蜂蜜花費的時間是10sthis

//十隻蜜蜂,2只熊spa

//注意:生產了一個流程不動了,不必定是死鎖了,不要忘記是寫在循環條件裏面線程

public class App {

public static void main(String[] args) {

Box box =new Box();

Bee bee1=new Bee(box,"b-1");

Bee bee2=new Bee(box,"b-2");

Bee bee3=new Bee(box,"b-3");

Bee bee4=new Bee(box,"b-4");

Bee bee5=new Bee(box,"b-5");

Bee bee6=new Bee(box,"b-6");

Bee bee7=new Bee(box,"b-7");

Bee bee8=new Bee(box,"b-8");

Bee bee9=new Bee(box,"b-9");

Bee bee10=new Bee(box,"b-10");

Bear bear1=new Bear(box,"熊大");

Bear bear2=new Bear(box,"熊二");

bee1.start();

bee2.start();

bee3.start();

bee4.start();

bee5.start();

bee6.start();

bee7.start();

bee8.start();

bee9.start();

bee10.start();


bear1.start();

bear2.start();

}

}

--------



package 做業一;


public class Bear extends Thread {

private Box box;//持有蜜罐---私有的,但這裏box和前面蜜蜂裏面定義的有關係麼?

public static String name="yyy";

//構造代碼塊

{

System.out.println("sss");

}

//構造函數

public Bear(Box box,String name){

super();

this.box=box;

this.name=name;

}

//run函數

public void run(){

while(true){

synchronized (box) {

if(box.capacity==Box.MAX){

int tmp=box.capacity;

box.capacity=0;

System.out.println(name+":吃掉了"+tmp);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO 自動生成的 catch 塊

e.printStackTrace();

}

box.notifyAll();

}

else{

try {

box.wait();//沒有滿的話等待

} catch (InterruptedException e) {

// TODO 自動生成的 catch 塊

e.printStackTrace();

}

}

}

}

}

}

-------

package 做業一;

//同步代碼塊比同步方法容易理解一些

//蜜蜂

//蜜蜂和熊的生產消費關係,熊在蜂蜜滿30斤吃掉。蜜蜂一次生產一斤,且一斤花費10秒(次要)

public class Bee extends Thread {//蜜蜂是線程

int i=0;

private int bag=0;//蜜蜂本身的小袋子

private static final int BAG_MAX=20;//袋子的最大容量

private static final int ONCE=5;//生產5斤能夠放入蜜罐,是放5斤仍是放多少的話還要取決於蜜罐的可用容量,本身袋子的量

private static final int TIME=10;//生產一斤花費的時間10s

private Box box;//蜜罐子的參數接收組進來,----取建立一個蜜罐

private String name;

//構造

public Bee(Box box, String name) {

super();

this.box = box;

this.name = name;

}

//run函數

public void run(){

while(true){

if(bag>=5){

//若是不足5,箱蜜罐放蜂蜜

synchronized (box) {//---在這裏運行的條件是bag>=5--生產5斤能夠放入蜜罐,是放5斤仍是放多少的話還要取決於蜜罐的可用容量,本身袋子的量

//取出當前蜜罐容量boox.capcity

int cap=box.capacity;//capacity是屬性

//蜜罐已滿

if(cap>=Box.MAX){

box.notifyAll();//通知熊吃蜜

}

else{//未滿,算蜜罐剩餘空間

int remain=Box.MAX-cap;

//蜜蜂帶

if(bag>=remain){

box.capacity=Box.MAX;

bag=bag-remain;

System.out.println(name+"添加了"+remain+",name.bag="+bag+",蜜蜂有"+box.capacity);

box.notifyAll();//通知熊來吃

}

else{//小於remain

box.capacity=box.capacity+bag;

System.out.println(name+"添加了"+bag+",name.bag="+bag+",蜜蜂有"+box.capacity);

bag=0;

}

}

}

}

else{//對應if(bag>=5)那裏-----bag<5的狀況

bag++;

System.out.println(name+".bag="+bag);

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO 自動生成的 catch 塊

e.printStackTrace();

}

}

}

}

}


----------------------

package 做業一;

//蜜罐子

public class Box {

public static final int MAX=30;//最大容量30

public int capacity=0;//當前容量

}






【--------------------------------做業2-------------------------------------------】

package 做業2;

//ctrl+shift+o自動導包

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;


//取出兩個字符串中最大的公共子串---------就是兩個字符串裏面連續字符相同最多的部分


//思路

//1.把字符串"abcd"變成a,ab,abc,abcd放進集合裏面---另一個字符串「bcde」變成b,bc,bcd,bcde放進集合裏面---//對應str1,str2包含的全部字符串

//3.而後遍歷比較集合裏面的每一個字符串,相同的字符串加入到相同的集合列表裏面--對應方法//包含相同的字符串那裏

//4.而後遍歷集合每一個元素的長度,取出長度最長的----對應//最大的公共子串那裏


//不過這個也有缺陷,如"abcdfff";"bcdefff";bcd和fff的長度都是同樣的,打出來確實bcd


public class LongestCommentString2 {



public static void main(String[] args) {


String str1 = "abcdfff";//"beijinggg1111ch@angpingshahe";

        String str2 = "bcdefff";//"beijinggggg@shahe";

        //char Str2[] = {'b', 'e', 'i','j'......};//效果其實就是這樣



        //調用下面的方法

        String comment = getLongestCommentString(str1, str2);

        System.out.println(comment);

        

//        測試

        List<String> str1Sub = new ArrayList<String>();

//        System.out.println(str1.substring(1, 2));

        

        for (int i = 0; i <= str1.length(); i++) {

            for (int j = i; j <= str1.length(); j++) {

//                System.out.println(str1.substring(i, j));

                str1Sub.add(str1.substring(i, j));

            }

        }

        

        //普通型遍歷集合

//        System.out.println("-------------------");

//        for(int i=0;i<str1Sub.size();i++){

//        System.out.print(str1Sub.get(i));

//        }

        

}


private static String getLongestCommentString(String str1, String str2) {

List<String> str1Sub = new ArrayList<String>();

        List<String> str2Sub = new ArrayList<String>();


        List<String> listSame = new ArrayList<String>();


        //str1包含的全部字符串

        for (int i = 0; i <= str1.length(); i++) {//str1仍是字符串

            for (int j = i; j <= str1.length(); j++) {

                str1Sub.add(str1.substring(i, j));

                //str1Sub.add(e)向列表str1Sub的尾部追加指定的元素

                

                //字符串String.substring方法

//                public String substring(int beginIndex,

//                        int endIndex)返回一個新字符串,它是此字符串的一個子字符串。

//                該子字符串從指定的 beginIndex 處開始,一直到索引 endIndex - 1 處的字符。所以,該子字符串的長度爲 endIndex-beginIndex。

            }

        }


        //str2包含的全部字符串

        for (int i = 0; i <= str2.length(); i++) {

            for (int j = i; j <= str2.length(); j++) {

                str2Sub.add(str2.substring(i, j));

            }

        }


        //包含相同的字符串

        for (int i = 0; i < str1Sub.size(); i++) {

            for (int j = 0; j < str2Sub.size(); j++) {

                if (str1Sub.get(i).equals(str2Sub.get(j))) {

                    listSame.add(str1Sub.get(i));

                }

            }

        }


        //最大的公共子串

        int maxId = 0;

        int maxValue = 0;

        for (int i = 0; i < listSame.size(); i++) {

            if (listSame.get(i).length() > maxValue) {

                maxId = i;

                maxValue = listSame.get(i).length();

            }


        }


        return listSame.get(maxId);

}


}



【--------------------------------做業3-------------------------------------------】

3.StringBuffer是線程安全的,StringBuilder不是線程安全。單線程訪問狀況下,性能是否一致?


答:性能不一致,StringBuilder在每次訪問的時候不須要判斷對象鎖是否被佔用,性能更好效率更高。


【--------------------------------做業4-------------------------------------------】

package 做業2;


//完成8種基本數據類包裝類的練習,完成自動拆裝箱操做。

//答:


public class autoUpUi4{

public static void main(String[] args) {

// byte類型的自動裝箱與拆箱

        Byte b1 = 1;//對應的包裝類,自動拆箱

        Byte b3 =new Byte("11");

//        參數:

//        s - 要轉換成 Byte 的 String 


        System.out.println(b3);

        byte b2 = b1;

        System.out.println("Byte " + (b1 == b2));


        // Short類型的自動裝箱與拆箱

        Short s1 = 1;

        short s2 = s1;

        System.out.println("Short " + (s1 == s2));


        // Integer類型的自動裝箱與拆箱

        Integer int1 = 1;

        Integer int3=new Integer(3);

        int int2 = int1;

        System.out.println("Integer " + (int1 == int2));


        // Long類型的自動裝箱與拆箱

        Long long1 = 1L;

        Long long3=new Long(2);

        System.out.println(long3+"--------");

        long long2 = long1;

        System.out.println("Long " + (long1 == long2));


        // Float類型的自動裝箱與拆箱

        Float f1 = 3.1415f;

        float f2 = f1;

        System.out.println("Float " + (f1 == f2));


        // Double類型的自動裝箱與拆箱

        Double d1 = 3.1415d;

        double d2 = d1;

        System.out.println("Double " + (d1 == d2));


        // 字符類型的自動裝箱與拆箱

        Character c1 = 'a';

        char c2 = c1;

        System.out.println("Character" + (c1 == c2));


        // Boolean類型的自動裝箱與拆箱

        Boolean bool1 = false;

        Boolean bool3=new Boolean(false);

        bool3=new Boolean("false");

        boolean bool2 = bool1;

        System.out.println("Boolean " + (bool1 == bool2));

}

}

相關文章
相關標籤/搜索