Java基础学习第九天
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础学习第九天相关的知识,希望对你有一定的参考价值。
作业说明:
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 一个F是4位,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
以上是关于Java基础学习第九天的主要内容,如果未能解决你的问题,请参考以下文章