售票窗口
public class Demo1 {
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
Thread t1 = new Thread(demo2, "窗口1");
Thread t2 = new Thread(demo2, "窗口2");
Thread t3 = new Thread(demo2, "窗口3");
Thread t4 = new Thread(demo2, "窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
public class Demo2 implements Runnable {
int ticket = 100;
@Override
public void run() {
while (ticket>0){
//显示出票时间
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//显示卖票号码
System.out.println(Thread.currentThread().getName()+":正在买票:"+ticket--);
}
}
}
此时这样会出现线程不安全的问题
public class Demo1 {
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
Thread t1 = new Thread(demo2, "窗口1");
Thread t2 = new Thread(demo2, "窗口2");
Thread t3 = new Thread(demo2, "窗口3");
Thread t4 = new Thread(demo2, "窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
//同步代码块
public class Demo2 implements Runnable {
//实例化对象,用于创建锁对象
final static Object o = new Object();
int ticket = 100;
@Override
public void run() {
synchronized (o) {
while (ticket > 0) {
//显示出票时间
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//显示卖票号码
System.out.println(Thread.currentThread().getName() + ":正在买票:" + ticket--);
}
}
}
}
//同步方法
public class Demo2 implements Runnable {
//实例化对象,用于创建锁对象
final static Object o = new Object();
int ticket = 100;
@Override
public void run() {
//调用show方法
show();
}
// 创建一个锁方法
public synchronized void show(){
while (ticket > 0) {
//显示出票时间
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//显示卖票号码
System.out.println(Thread.currentThread().getName() + ":正在买票:" + ticket--);
}
}
}
public class Demo1 {
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
Thread t1 = new Thread(demo2, "窗口1");
Thread t2 = new Thread(demo2, "窗口2");
Thread t3 = new Thread(demo2, "窗口3");
Thread t4 = new Thread(demo2, "窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
//死锁
要产生死锁起码要产生两个锁才会有可能产生死锁,而在Java中使用多线程都会产生死锁
public class Demo1 {
public final static String A="a";
public final static String B="b";
public static void main(String[] args) {
//创建两个锁机制
new Thread(new Runnable() {
@Override
public void run() {
synchronized (A) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程A----拥有A锁");
synchronized (B) {
System.out.println("线程A-----拥有B锁");
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (B){
System.out.println("线程B--------拥有B锁");
synchronized (A){
System.out.println("线程B-------拥有A锁");
}
}
}
}).start();
}
}
//而此时这种状况就会出现死锁
包子铺案例
//吃包子,说明要有包子资源
public class BaoZi {
//包子里面有包子皮,包子馅,和包子是否存在的状态
String pier;
String xianer;
boolean flag = false;//此时默认包子不存在
}
//包子铺生产包子,包子铺需要获得包子的属性,
//包子铺需要抢占cpu资源,所以需要继承Thread
public class BaoZiPu extends Thread{
//初始化一个bz参数,用于上锁的参数,而这个参数的类型是包子类型,这样就可以引用包子里的属性
//这样就可以把包子和包子铺之间产生联系
private BaoZi bz;
//这时我们需要实现run方法
public BaoZiPu(String name,BaoZi bz){
super(name);
this.bz=bz;
}
@Override
public void run() {
//默认包子的数量是0
int count = 0;
//b
while (true){//通过一个循环说明包子铺是一直造包子
//对于生产包子,需要抢占cpu资源,所以我们需要上锁
synchronized (bz){//这里的bz相当于一个锁,
//如果要生产包子,我们需要看看包子是不是还有
if (bz.flag==true){//此时说明还有包子,我们不需要生产
//有包子我们这个包子铺线程需要等待
try {
//而这个等待是传入的这个锁的参数进行等待,这里面就是bz
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//说明没有包子,需要造包子
//这时我们需要唤醒包子铺进程,制造包子
bz.notify();
System.out.println("包子铺正在造包子");
//在这里包子分为两类
if (count%2==0){
bz.pier="冰皮";
bz.xianer="五仁";
}else {
bz.pier="薄皮";
bz.xianer="牛肉大葱";
}
//此时说明做好了
count++;
//做好之后我们就让包子铺中显示有包子
bz.flag = true;
System.out.println("包子造好了:"+bz.pier+bz.xianer);
System.out.println("吃货来吃吧");
}
}
}
}
//要标明是一个线程
public class ChiHuo extends Thread {
//同样的,我们需要提供一个锁
private BaoZi bz;
public ChiHuo(String name,BaoZi bz){
super(name);
this.bz=bz;
}
@Override
public void run() {
while (true){//人要一直吃
//对该方法进行上锁
synchronized (bz){
if (bz.flag==false){//此时说明没有包子
//这时我们需要让ChiHuo等待
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//否则说明有包子
bz.notify();
System.out.println("吃货正在吃"+bz.pier+bz.xianer+"包子");
//当我们吃完包子时,说明包子没有了
bz.flag=false;
}
}
}
}
/*
* 这个包子说明有三个类
* 1、包子类 2、包子铺类 3、人类(这里面我们时吃货类)
* */
public class Program {
public static void main(String[] args) {
//实例化三个对象
BaoZi baoZi = new BaoZi();
BaoZiPu bzp = new BaoZiPu("包子铺",baoZi);
ChiHuo ch = new ChiHuo("吃货", baoZi);
bzp.start();
ch.start();
}
}
线程池
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Program {
public static void main(String[] args) {
/* ExecutorService es = Executors.newCachedThreadPool();//随任务产生线程池
for (int i =0;i<100;i++){
int temp = i;
es.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" "+"i="+temp);
}
});
}*/
//自定线程池里的线程的个数
ExecutorService es = Executors.newFixedThreadPool(4);
for (int i = 0;i<100;i++){
int temp = i;
es.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" "+"i="+ temp);
}
});
}
}
}
文件操作
import java.io.File;
import java.io.IOException;
import java.util.Date;
public class Demo5 {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\fuwei\\Desktop\\Test\\test1");
//1、这个文件必须不存在,才能创建成功
boolean newFile = file.createNewFile();
File file1 = new File("C:\\Users\\fuwei\\Desktop\\Test\\aa");
//创建新的目录
boolean mkdir = file1.mkdir();
//创建多级目录
File file2 = new File("C:\\Users\\fuwei\\Desktop\\Test\\aa\\bb\\cc\\dd");
boolean mkdir1 = file2.mkdirs();
//2、删除文件
boolean delete = file.delete();
//3、判断文件或者文件夹是否存在
boolean exists = file1.exists();
//判断是否是文件
File file3 = new File("C:\\Users\\fuwei\\Desktop\\Test\\test.txt");
boolean newFile1 = file3.createNewFile();
boolean file4 = file3.isFile();
//判断文件是否是目录
boolean directory = file2.isDirectory();
//判断文件是否是隐藏文件
boolean hidden = file3.isHidden();
//判断文件是否可读
boolean b = file3.canRead();
//判断文件是否是可写
boolean b1 = file3.canWrite();
//重命名功能,保证参数的对象路径是一致的
boolean b2 = file3.renameTo(new File("C:\\Users\\fuwei\\Desktop\\Test\\test1.txt"));
//4、获取
//获取绝对路径
String absolutePath = file3.getAbsolutePath();
//获取相对路径
String path = file3.getPath();
//获取文件名
String name = file3.getName();
//获取文件的大小
long length = file3.length();
//获取最后一次修改的时间
long l = file3.lastModified();
Date date = new Date(l);
//获取父目录
String parent = file3.getParent();
//获取当前目录下所有信息
String[] list = file3.list();
//获取该目录下的文件的列表
File[] files = file3.listFiles();
}
}
判断某一目录下是否含有.java文件,如果有就输入文件的名称
import java.io.File;
import java.io.IOException;
public class Demo6 {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\fuwei\\Desktop\\Test");
//先判断是否有.Java文件
//首先获取所有的文件
//通过数组去获取所有的文件
File[] files = file.listFiles();
for (File file1 : files) {
//获取文件的名称
String name = file1.getName();
//判断文件的后缀名
if (name.endsWith("java")){
System.out.println(name);
}
}
}
}
|