作业说明:

1.一共100个馒头,40个工人,每个工人最多能吃3个馒头。使用多线程输出所有工人吃馒头的情况。

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

多线程中的串行化机制 synchronized

class MantouDemo{

public static void main(String[] args){

//定义一个篮子馒头对象

Basket basket = new Basket();

//定义40个工作对象

for (int i = 1 ; i <= 40 ; i++ )

{

new Worker("Work-" + i , basket).start();

}

 

}

}

 

//因为是40个人一起吃,是多线程进行,所以继承Thread多线程类

class Worker extends Thread{

private String name ;

private static int MAX = 3 ;  //定义工人可以吃馒头的最大数

private int count ; //工人吃的数量

private Basket basket ;

 

public Worker (String name , Basket basket){

this.name = name ;

this.basket = basket ;

}

 

//定义吃的方法

public void run(){

while(true){

//1.判断是否已经吃到最大数了

if(count >= MAX){

return ;

}

//2.取馒头,返回的是取的数量

int no = basket.getMantou();

if(no == 0){  //说明没有馒头了

return ;

}

//3.取到馒头了

count ++ ;

System.out.println(name + "号工人取到了第:"+ no + ":个馒头") ;

}

}

 

}

 

//篮子

class Basket{

private int count = 100 ; //总馒头数量

 

//加同步修饰的同步方法,以当前对象作为锁旗标

public synchronized int getMantou(){

int temp = count ;

count -- ;

return temp > 0 ? temp : 0 ;

}

}

==============================

3.用多线程模拟蜜蜂和熊的关系。

   蜜蜂是生产者,熊是消费者。蜜蜂生产蜂蜜是累加的过程,熊吃蜂蜜是批量(满20吃掉)的过程。

   生产者和消费者之间使用通知方式告知对方。注意不能出现死锁的现象。

100只蜜蜂,每次生产的蜂蜜是1.

熊吃蜂蜜是20(批量的情况)。

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

class BeeDemo{

public static void main(String[] args){

BeeBox box1 = new BeeBox();

 

for (int i = 1 ; i <= 100 ; i ++ ){

new Bee(i + "号蜜蜂",box1).start();

}

 

Bear x1 = new Bear("熊1" ,box1);

Bear x2 = new Bear("熊2" ,box1);

x1.start();

x2.start();

}

}

 

//蜜蜂类,继承线程,因为是100个蜜蜂同时生产

class Bee extends Thread{

private String name ;

private BeeBox beebox ;

 

public Bee(String name , BeeBox beebox){

this.name = name ;

this.beebox = beebox ;        

}

public void run(){

while(true){

int n = beebox.add();

System.out.println( name + "生产了第"+n+"个蜂蜜");

 

}

 

}

}

 

//两只熊同时吃蜂蜜,多线程并发

class Bear extends Thread{

private String name ;

private BeeBox beebox ;

 

public Bear(String name , BeeBox beebox){

this.name = name ;

this.beebox = beebox ;        

}

 

public void run(){

while(true){

beebox.remove();

//打印输出哪只熊吃掉了蜂蜜

System.out.println(name + "吃掉了个蜂蜜!");

}

}

}

 

//蜂蜜罐

class BeeBox{

//蜜罐可存放的最大量

private int MAX = 20 ;

//蜜罐当前存放量

private int count ;

 

//添加蜜的方法 每次+ 1

public synchronized int add(){

while(count >= MAX){

try{

this.notify();

this.wait();

}

catch(Exception e){

e.printStackTrace();

}

}

return count++;

}

 

//移除蜜的方法 每次移除最大量-20

public synchronized void remove(){

while (count < MAX){

try{

this.wait();

}

catch(Exception e){

e.printStackTrace();

}

}

count = 0 ;

this.notify();

}

}

 

 

Thread

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

并发。

在一个类已经有继承类了,但需要实现多线程,就可以让类实现 Runnable接口。

 

java.lang.Runnable

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

1.接口

2.这个接口中只有一个public void run() ;方法

3.供现有类实现线程功能。

4.使用Runnable对象创建线程

new Thread(Runnable r).start();

5.静态同步方法是使用class作为锁。

6.非静态同步方法是使用this(当前对象)作为锁。

 

class Car implements Runnable{

...

//静态同步方法

static synchronized void xxx(){

...

}

}

 

new Thread(Runnable r).start();

 

s.start();是我们用来调run方法的

s.run();这个方法是由jvm调的,

 

线程安全性(同步synchronized是用来解决线程安全性问题的)

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

同步代码块

synchronized(Object){

...

}

 

非静态同步方法 ,以对象为锁

public synchronized void xxx(){

...

}

 

静态同步方法,以类作为锁

public static synchronized void xxx(){

...

}

 

IDE

---------

集成开发环境:

integrate development environment.

 

eclipse

-----------        

1.日蚀.

2.netbeans.

3.IDEA

4.borland Jbuilder

 

5.透视图

perspective,

eclipse -> windows -> perspective ->

6.视图

eclipse -> windows -> show view -> other -> all view

 

7.指定工作空间

eclipse --> file -> switch workspace -> other -> new -> ...

8.清理项目

    Project --->Clean--->Clean projcets selected below 表示把编译后的 bin目录下的内容全部清理,为重新编译做准备

 

9.alt + /

 

10.build path  构建路径 就是指定类库的路径,如果需要使用其他的类库,也是通过这个添加。

classpath

11.

 

线程状态

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

1.NEW

尚未运行。

2.RUNNABLE

正在运行的状态。

3.BLOCKED

等待检视器的锁定权。

synchronized(this){

 

}

4.WAITING

等待状态(无限等待)

一个线程在等待另一个线程特定的操作。()

wait();

5.TIMED_WAITING

限时等待。

等待指定时间。

wait(xxx);

6.TERMINATED

线程退出。

 

7.Sleep

休眠。

 

String

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

1.java.lang.String

2.java.lang.Integer

3.常量

String name = "xxx" ;

name = "ddd";

for(i < 100000){

name = name + "" + i;

}

byte b = (int)1234;

String str = 123 + "" ; 将数字变成字符串

Object o = new Dog();

Dog d = (Dog)o ;

4.创建String区别

//1个对象 ,字符在串池中

String str1 = "abc";

//2对象 ,这里使用了new 在堆分配了空间

String str2 = new String("abc");

 

5.split()

切割字符串,形成String数组.

"hello,,,world,".split(",");最后的,不生效.

 

6.调试 debug,找虫子

 

7.String.substring();

子串.

//beginIndex : int

//endIndex : int

"hello world".substring(beginIndex,endIndex);

//子串是前包后不包

"hello world".substring(6,10);

 

编码表

-----------

所有的文字在计算机中都是用数字表示的,对应到相应的编码表中,就表示对应的文字了。

1.ascii,美国标准交换码

7位表示

2.iso-8859-1

欧洲码表,一个byte的8表示。

3.GB2312

简体中文。2个字节表示.

4.unicode   例:\uFFFF 一个F4位,FF代表1个字节

国际标准码.包含各国文字。使用2个字节

JAVA在计算机中的字符内部就是用这个形式存储的

5.UTF-8

最多使用3个byte表示字符。

 

char c = 97 ;//int

一个字符的赋值可以通过 数值、字符、unicode来赋值

char a = 97 ;  //用数值

a = 'a' ;           //直接使用字符

a = '\u0063';  //使用unicode码(unicode码是4位的)

 

作业

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

1.StringUtil.

substring(int beginIndex,int length);

2.

3.

4.com.it18zhang.stringdemo.App