javaSE-day15-多线程安全处理、单例设计模式、jsond字符串解析、命令行编译运行程序、导出jar可运行包

多线程安全处理

设置一个从常量来当作库存

package day15.ThreadSaft;

public class KuCun {
	
	public int num = 100;

}

多线程的run方法 以及安全处理

package day15.ThreadSaft;

public class SellRunnable implements Runnable {
	KuCun kuCun;

	public SellRunnable(KuCun kuCun) {
		this.kuCun = kuCun;
	}

	@Override
	public void run() {
		while (true) {

			// 加一把锁,表示锁住的逻辑同时只能让一个线程来执行
			synchronized ("1") {

				if (kuCun.num > 0) {
					try {
						Thread.sleep(50);
						kuCun.num = kuCun.num - 1;
						System.out.println(kuCun.num);
					} catch (Exception e) {

					}
				}

			}

		}
	}

}

启用多线程

package day15.ThreadSaft;

public class Test {
	public static void main(String[] args) {
		KuCun kuCun = new KuCun();

		for (int i = 0; i < 10; i++) {
			new Thread(new SellRunnable(kuCun)).start();
		}

	}

}

总结:
当我们使用多线程的时候,可能会存在对一个数据重复处理的情况,当使用库存,库存减一的时候,其他线程也有可能执行减一操作,这样就出现了负数的情况,所以引入了线程锁的使用,使用线程锁只能允许一个线程操作线程锁内部逻辑。

单例设计模式

懒汉式

package day15.singleton;

import java.util.HashMap;

/**
 * 单例设计模式: 核心思想:这个类,在程序的其他模块,获取它的对象时,拿到的永远是一个对象 懒汉式----在调用它的时候才会生成对象
 * 懒汉式在多线程可能存在创建多个对象的可能,所以加入了线程锁
 * 
 * @author Integer
 *
 */
public class ProductDb {
	public HashMap<String, String> p = new HashMap<>();
	static ProductDb pdb = null;

	private ProductDb() {
	}

//	  public static synchronized ProductDb getProductDb() {
//		  if(pdb==null) {
//			  pdb = new ProductDb();
//		  }
//		  return pdb;
//	  }
	
	
	//只有前两个进程会封锁,后边的不会,所以可以提高多线程的效率
	public static ProductDb getProductDb() {
		if (pdb == null) {
			synchronized (pdb) {
				if (pdb == null) {
					pdb = new ProductDb();
				}
			}
		}
		return pdb;
	}
}

饿汉式

package day15.singleton;

import java.util.HashMap;
//饿汉式,在开始就建一个对象
public class ProductDb2 {
	
		  public HashMap<String,String> p = new HashMap<>();
		  //该对象为静态的属于类对象
		  static ProductDb2 pdb = new ProductDb2();
		  
		  private ProductDb2(){}
		  
		  public static ProductDb2 getProductDb() {
			  
			  return pdb;
		  }
}

Test

package day15.singleton;

public class Test1 {
	public static void main(String[] args) {
		//通过打印地址来判断是不是同一个对象
//		ProductDb pdb1 = ProductDb.getProductDb();
//		ProductDb pdb2 = ProductDb.getProductDb();
//		System.out.println(pdb1);
//		System.out.println(pdb2);
		
		
		//测试懒汉式在多线程应用中的不足
		Thread t1 = new Thread(new Runnable(){

			@Override
			public void run() {
				ProductDb db = ProductDb.getProductDb();
				System.out.println(db);
			}
			});
		
		
		
		Thread t2 = new Thread(new Runnable(){
			
			@Override
			public void run() {
				ProductDb db = ProductDb.getProductDb();
				System.out.println(db);
			}
		});
		
		t1.start();
		t2.start();
	}
}


jsond字符串解析

** MoiveRate类**

package day15.jsond;

public class MoiveRate {
	private String movie;
	private String rate;
	private String timeStamp;
	private String uid;

	public String getMovie() {
		return movie;
	}

	public void setMovie(String movie) {
		this.movie = movie;
	}

	public String getRate() {
		return rate;
	}

	public void setRate(String rate) {
		this.rate = rate;
	}

	public String getTimeStamp() {
		return timeStamp;
	}

	public void setTimeStamp(String timeStamp) {
		this.timeStamp = timeStamp;
	}

	public String getUid() {
		return uid;
	}

	public void setUid(String uid) {
		this.uid = uid;
	}

	@Override
	public String toString() {
		return "MoiveRate [movie=" + movie + ", rate=" + rate + ", timeStamp=" + timeStamp + ", uid=" + uid + "]";
	}
	
}

封装了解析字符串的方法—json

package day15.jsond;

import com.google.gson.Gson;

public class MoiveRateLogParse {
	// 解析字符串
	public static MoiveRate parseLine(String line) {

		Gson gson = new Gson();
		// 传入一个字符串,Gson对象调用formJson按照moiveRate类来解析该字符串,然后返回一个moiveRate对象
		MoiveRate moiveRate = gson.fromJson(line, MoiveRate.class);

		return moiveRate;

	}

}

传入文件,来解析文件中的数据,生成对象

package day15.jsond;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class Test {
	public static void main(String[] args) throws Exception {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("d:/rating.json"), "UTF-8"));
		String line = "";
		while((line = br.readLine())!=null) {
		//静态方法,类名直接调用
		MoiveRate mrObj = MoiveRateLogParse.parseLine(line);
		
		System.out.println(mrObj);}
		br.close();
	}

}

命令行编译运行程序

1.java文件本身是不能被jvm所执行的,需要编译成class文件

2、java文件可以用jdk中提供的工具javac来编译

3、javac命令如何才能让系统识别呢?需要将jdk的bin目录配置到系统的环境变量path中

4、如何配置path变量呢?
在“我的电脑”点右键–>属性–>高级系统设置–>环境变量–>系统变量–> 编辑Path变量 --> 浏览–>选择jdk的bin目录 -->一路确定
然后新开一个命令行窗口: Win+R键–>cmd–>回车
然后在命令行窗口中:先打开保存java文件的路径,然后javac xx.java编译该文件,生成xx.class文件 然后java xx 就可以运行该文件了

导出jar可运行包

前面已经编写了helloWorld的程序,也可以在Eclipse IDE中正常运行,但如何脱离IDE运行呢?

先通过代码生成JAR文件,选择“File→Export…”,弹出Export对话框,选择“Java→Runnable JAR file”(注意此处不是选"JAR file",否则导出的文件无法运行,提示Failed to load Main-Class manifest attribute from),点Next,Launch configuration中选择项目的类名(此处为 HelloWorldApp - HelloWorld),Export destination添写为hello.jar,其他默认,点“Finish”生成文件。
运行文件,导出的文件,双击可运行,hello.jar是在控制台中打印一句语句,一闪就没了,可以直接在命令行中文件,通过cmd进入到存hello.jar的目录下,运行java -jar hello.jar就可以运行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值