进程与线程(一)=====>线程安全
1.并发访问(同一个时间段内执行)<====>并行(同时刻)
2.Thread.sleep(1000);//当前线程睡1秒(1000毫秒)当前线程休息,其他线程先占用资源
3.子类覆盖父类方法 子类不能抛出新的异常 只能使用Try-cache方法
4.synchronized 不能修饰 run方法 因为修饰过之后 就执行完了
线程安全 1.synchronized 2.线程锁 lock
实例:1.synchronized 也可以作为一个修饰符放在类或者方法前面 但是 要做到 范围尽可能的小 所以用下面的代码块
synchronized(){
/*要执要执行的资源*/
}
2.synchronized
package xiancheng;
/*解决方法
* 1.同步代码块
* 2.同步方法
* 3.锁机制【同步锁:同步监听对象,互斥锁,同步监听锁】
*/
class Chi implements Runnable{
public static int num=100;
public void run() {
for (int i = 0; i < 100; i++) {
synchronized(this){//小括号内可以放Chi.class【我也不知道为什么】
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
if(num>0) {
System.out.println(Thread.currentThread().getName()+"吃了第"+num--+"个苹果");
}
}
}
}
}
public class Youxi {
public static void main(String[] args) {
Chi a = new Chi();
new Thread(a,"小A").start();
new Thread(a,"小B").start();
new Thread(a,"小C").start();
}
}
2. lock====>创建对象 获取锁 释放锁 try-catch-finally 【父类中没有抛出错误子类中就不能抛出错误 只能使用try catch】
package xiancheng;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/*解决方法
* 1.同步代码块
* 2.同步方法
* 3.锁机制【同步锁:同步监听对象,互斥锁,同步监听锁】
*/
class Chi implements Runnable{
public static int num=100;
private final Lock lock = new ReentrantLock();
public void run() {
for (int i = 0; i < 100; i++) {
lock.lock();
try {
Thread.sleep(20);
if(num>0) {
System.out.println(Thread.currentThread().getName()+"吃了第"+num--+"个苹果");
}
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
finally {
lock.unlock();
}
}
}
}
public class Youxi {
public static void main(String[] args) {
Chi a = new Chi();
new Thread(a,"小A").start();
new Thread(a,"小B").start();
new Thread(a,"小C").start();
}
}
线程 分为 Tread 和Runnable
1.tread方法
package xiancheng;
/*继承Thread类的线程===>
* 创建对象继承Thread类 并且覆盖里面的run方法
* 主线程里面 同样运行另一个线程
* 主线程中启动线程用start()方法[调用方法]
* */
public class LineThreadDemo {
public static void main(String[] args) {
/*主线程*/
for (int i = 0; i < 50; i++) {
System.out.println("打游戏");
if (i == 3) {
/*MusicThread music = new MusicThread();
music.start();*/
//或者使用匿名内部类来实现
new Thread() {
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println("播放音乐");
}
}
}.start();
}
}
}
}
/*
class MusicThread extends Thread {
第一步:覆盖Theread中的run方法
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println("播放音乐");
}
}
}*/
/**
* 线程的实现两种方式
* 1.继承Thread类的
* 2.实现Runnable接口
* */
2.Runnable方法
package xiancheng;
public class RunnableDemo {
public static void main(String[] main) {
for(int i=0;i<50;i++) {
System.out.println("跳舞");
if(i==10) {
Yunxing yunxing = new Yunxing();
Thread thread = new Thread(yunxing);
thread.start();
}
}
}
}
class Yunxing implements Runnable{
public void run() {
for(int i = 0;i<50;i++) {
System.out.println("唱歌");
}
}
}

浙公网安备 33010602011771号