JAVA坎坷之路(8 day)

编程开发   © 文章版权由 admin 解释,禁止匿名转载

#楼主# 2022-6-27

/**
*
* I/O输入输出流
* File类中的java.io包是唯一代表磁盘文件本身的对象
* 它定义了一些与平台无关的方法用于操作各种文件
* 通过调用File类提供的各种方法 能够创建 删除 或重命名文件
* 判断硬盘上某个文件是否存在
* 查询文件最后修改时间
*/
// 通过指定的字符串类型的文件路径来创建一个新的File对象
File file = new File("D:\\MyProject\\luhuxai_java\\src\\main\\java\\a.txt");
// 根据指定的字符串类型的父路径和字符串类型的子路径(包括文件名称)创建一个新的File对象
File file1 = new File("D:\\MyProject\\luhuxai_java\\src\\main\\java","b.txt");
// 根据指定的File类的父路径和字符串类型的子路径(包括文件名称)创建一个新的File对象
File file2 = new File("D:\\MyProject\\luhuxai_java\\src\\main\\java");
File file3 = new File(file2,"c.txt");

/**
* File类的常用方法
*/
// 判断Flie对象对应的文件或目录是否存在 若存在则返回true 否则返回false
boolean exists = file.exists();
System.out.println(exists);
// 删除File对象对应的文件或目录 若删除成功则返回true 否则返回false
boolean delete = file.delete();
System.out.println(delete);
// 当File对象对应的文件不存在时 该方法将新建一个此File对象所指定的新文件 若创建成功 则返回true 否则返回false
boolean newFile = file.createNewFile();
System.out.println(newFile);

结合代码和结果得出
继承thread的多线程不共享一个变量
实现runnable的多线程共享变量

public class Huluxia{
public static void main(String[] args) throws Exception{
// 实例化fg对象
Fg fg = new Fg();
//// 创建线程对象
// Thread thread = new Thread(fg);
//// 开启线程
// thread.start();
// 简化写法 实现Runnable接口
new Thread(fg,"线程1").start();
new Thread(fg,"线程2").start();
new Thread(fg,"线程3").start();
// 简化写法 继承Thread类
new F().start();
// 线程2
new F().start();
// 线程3
new F().start();
}
}
//实现Runnable接口创建多线程
class Fg implements Runnable{

private Integer a=10;

@Override
public void run() {
while (a>=0)
{
System.out.println("我是多线程....."+a--);

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
class F extends Thread{

private Integer a=10;

@Override
public void run() {
while (a>=0)
{
System.out.println(Thread.currentThread().getName()+"我是继承Thread的多线程....."+a--);

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}

/**
* 线程的生命周期
* 任何对象都有生命周期
* 当Thread对象创建完成 线程的生命周期便开始了
* 当线程代码执行完毕或抛出异常时 线程的生命周期结束
* 线程生命周期的5个阶段
* 一、新建状态
* 创建一个线程对象后 该线程就处于对象状态 此时它不能运行 仅仅是java虚拟机为其分配了内存 没有表现出任何线程的动态特征
* 二、就绪状态
* 当线程对象调用了start()方法后 该线程就进入就绪状态 处于就绪状态的线程 位于线程队列中 此时它只是具备了运行的条件 能否获得cpu的使用权并开始运行 还需要等待系统的调度
* 三、运行状态
* 如果处于就绪状态的线程获得了cpu的使用权
* 并开始执行run()方法中的线程执行体
* 则该线程处于运行状态 一个线程启动后 它可能不会一直处于运行状态
* 当运行状态的线程使用完系统分配的时间后
* 系统就会剥离该线程占用的cpu资源
* 让其他线程获得执行的机会
* 注意 只有处于就绪状态的线程才可能转换到运行状态
* 四、阻塞状态
* 一个正在执行的线程在某些特殊情况下
* 如被人挂起或执行耗时的输入/输出操作时
* 会让出cpu的使用权 并暂时中止自己的执行
* 进入阻塞状态 线程进入阻塞状态后
* 就不能进入队列排队 只有当引起阻塞的原因被消除后
* 线程才可以转入就绪状态
* 列举
* 线程由运行状态转换阻塞状态的原因 以及如何从阻塞状态转换就绪状态
* 1.当线程试图获取某个对象的同步锁时
* 如果该锁被其他的线程所持有
* 则当前线程会进入阻塞状态 如果想从阻塞状态进入就绪状态就必须获取到其他线程所持有的锁
* 2.当线程调用了一个阻塞式的I/O方法时
* 该线程就会进入阻塞状态 如果想进入就绪状态
* 就必须要等到这个阻塞的I/O方法返回
* 3.当线程调用了某个对象的wait()方法时
* 也会使线程进入阻塞状态 如果想进入就绪状态就需要使用notify()方法唤醒线程
* 4.当线程调用了Thread的sleep()方法时
* 也会使线程进入阻塞状态 在这种情况下 只需等到线程睡眠的时间到后
* 线程就会自动进入就绪状态
* 5.当在一个线程中调用了另一个线程的join()方法
* 会使当前线程进入阻塞状态
* 在这种情况下 需要等到新加入的线程运行结束后才会结束阻塞状态 进入就绪状态
* 注意点
* 线程从阻塞状态只能进入就绪状态
* 而不能直接进入运行状态
* 结束阻塞的线程需要重新进入可运行池中
* 等待系统的调度
* 五、死亡状态
* 如果线程调用stop()方法或run()方法正常运行完毕
* 或者线程抛出一个未捕获的异常 错误
* 线程就会进入死亡状态 一旦进入死亡状态
* 线程将不再拥有运行的资格
* 也不能再转换到其他状态
*
*/
各位道友
历经十天的磨练
吾已达到练气八层
吾已为突破筑基做好准备
[滑稽][滑稽][滑稽][滑稽]
public class Huluxia{
public static void main(String[] args) throws Exception{
/**
* 线程的调度
* 程序中的线程是并发执行的
* 某个线程若是想被执行 必须得到cpu的使用权
* java虚拟机会按照特定的机制为程序中的每个线程分配cpu的使用权
* 这种机制叫做调度
* 线程调度有两种模式
* 分时调度和抢占式调度
* 分时调度
* 是指让所有的线程轮流获得cpu的使用权
* 并且平均分配每个线程占用的cpu时间片
* 抢占式调度
* 是指让可运行池中优先级高的线程优先占用cpu
* 而对于优先级相同的cpu
* 随机选择一个线程使其占用cpu
* 当它失去cpu的使用权后
* 再随机选择其他线程获取cpu使用权
* java虚拟机默认使用抢占式调度模型
*/
// 线程的优先级
Thread thread = new Thread(new Xc());
// 设置线程的优先级
// MAX_PRIORITY 表示线程的最高优先级 值为10
// MIN_PRIORITY 表示线程的最低优先级 值为1
// NORM_PRIORITY 线程的普通优先级 值为5
// 也可以自定义
// thread.setPriority(2);
// thread.setPriority(Thread.MAX_PRIORITY);
thread.start();
// 线程休眠
// 传入的参数为毫秒 1000毫秒等于1秒 这里需要捕获异常 但我已经在方法抛出异常
// Thread.sleep(1000);
for (int i = 0; i 15; i++) {
System.out.println("主线程.....");
if(i==2){
// 线程插队
// 当某个线程调用其他线程的join方法时 调用的线程将被阻塞
// 直到被join方法插入的线程执行完毕后它才会继续运行
thread.join();
}
}
}
}
class Xc implements Runnable{

@Override
public void run() {
// 线程让步
// 与sleep的区别在
// yield不会阻塞线程 而是将线程转为就绪状态
// Thread.yield();
for (int i = 0; i 10; i++) {
System.out.println(Thread.currentThread().getName()+"==="+i);
}
}
}
public class Huluxia{
public static void main(String[] args) throws Exception{
/**
* 多线程同步
* 线程安全问题
*/
Xc xc = new Xc();
new Thread(xc,"线程安全问题1").start();
new Thread(xc,"线程安全问题2").start();
new Thread(xc,"线程安全问题3").start();
new Thread(xc,"线程安全问题4").start();
new Thread(xc,"线程安全问题5").start();
new Thread(xc,"线程安全问题6").start();

}
}
class Xc implements Runnable{

private Integer a=10;

@Override
public void run() {
while (a>0)
{
try {
Thread.sleep(200);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}finally {
System.out.println(Thread.currentThread().getName()+"**a的值**"+a--);
}
}
}
}

public class Huluxia{
public static void main(String[] args) throws Exception{
/**
* 多线程同步
* 线程安全问题
*/
Xc xc = new Xc();
new Thread(xc,"线程安全问题1").start();
new Thread(xc,"线程安全问题2").start();
new Thread(xc,"线程安全问题3").start();
new Thread(xc,"线程安全问题4").start();
new Thread(xc,"线程安全问题5").start();
new Thread(xc,"线程安全问题6").start();

}
}
class Xc implements Runnable{
//当多个线程公用一个共享资源时
//可以将共享资源放在synchronized关键字修饰的代码块中
// 这个代码块称为同步代码块
private Integer a=10;
// 定义任意一个对象 作为同步代码块的锁
Object lock = new Object();
@Override
public void run() {
// lock锁对象 它是同步代码块的关键
// 当某一个线程执行同步代码块时
// 其他线程无法执行当前同步代码块
// 会发生阻塞 等当前线程执行完同步代码块后
// 所有的线程开始抢夺线程的执行权
// 抢到执行权的线程将会进入同步代码块
// 执行其中的代码 循环往复 直到共享资源被处理完为止
// 注意点
// 同步代码块中的锁对象可以是任意类型的对象 但多个线程共享资源的锁对象必须是唯一的 任意 说的是共享锁对象的类型
// 锁对象的创建代码不能放到run方法
// 否则每个线程运行到run方法都会创建一个新的对象
// 这样每个线程都会有一个不同的锁
// 每个锁都有自己的标志
// 这样线程之间便不能产生同步的效果
synchronized (lock)
{
while (a>0)
{
try {
Thread.sleep(200);
System.out.println(Thread.currentThread().getName()+"**a的值**"+a--);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
}
死锁问题
两个线程在运行时都在等待对方的锁
这样便造成了程序的停滞
这种现象称为死锁
28楼
昵称660054 2022-6-27
兄弟学了多久了
久到无法想象[滑稽][滑稽][滑稽]
明天
网络编程
或许会到jdbc
图形化不学
最后是反射
[滑稽][滑稽][滑稽]
明天练气九重了兄弟们
只希望渡劫飞升
1 2 3

评论

登录后才可发表内容
  • 主题

    23

  • 帖子

    325

  • 关注者

    0

Copyright © 2019 凯特网.   Powered by HYBBS 2.3.4  

Runtime:0.1172s Mem:2149Kb