java线程创建和方法,及解决安全问题学习笔记
2020-07-16 05:35
17 查看
线程的创建:
1.继承Thread创建。
2.实现Runnable接口创建
第一种方法:
class Window extends Thread{ //重写run方法实现逻辑 @Override public void run(){ } } class Test{ public static void main(String[] args){ Window w1=new Window; w1.start(); } }
第二种方法:
class Window implements Runnable{ //重写run方法实现逻辑 @Override public void run(){ } } class Test{ public static void main(String[] args){ Window window=new Window; new Thread(window).start(); } }
线程中的方法:
start():启动该线程;调用该线程的run()方法;
run():重写run()方法,写逻辑代码
yield():释放当前线程的执行权
join():在a线程中调用b线程的join()方法,会执行b线程,a线程进入阻塞状态,知道b线程执行完之后,a线程才会开始执行。
sleep(longe time):让当前线程“睡眠”指定的time毫秒,在指定的time毫秒时间内,当前线程为阻塞状态
isAlive():判断当前线程是否存活
stop():已过时不推荐使用
getPriority():得到线程优先级 **************高优先级线程只是高概率的情况下被执行
setPriority():设置线程优先级
(目前总结了这些,可能还有很多没总结到)
线程安全问题的解决:
1.同步代码块:
简单方法:实现Runnable类的创建线程方法可用this来做监视器,继承Thread创建线程可用当前类做监视器。
其他方法:任何一个对象来充当监视器
synchronized(监视器){
同步代码块(对共享数据操作的代码)
}
继承Thread创建的线程解决线程安全问题:
package com.nsu.edu.cn.thread; class Window extends Thread{ private static int ticket=100; @Override public void run() { while (true){ synchronized(Window.class) { if (ticket > 0) { System.out.println(getName() + ":" + ticket); ticket--; } if (ticket <= 0) { break; } } } } } public class WindowTest1 { public static void main(String[] args) { Window w1=new Window(); Window w2=new Window(); Window w3=new Window(); w1.start(); w2.start(); w3.start(); System.out.println(); } }
实现Runnable接口创建的线程解决线程安全问题:
package com.nsu.edu.cn.thread; class Window1 implements Runnable{ private int ticket=100; @Override public void run() { while (true){ synchronized(this) { if (ticket > 0) { System.out.println(Thread.currentThread().getName() + ":" + ticket); ticket--; }else { break; } } } } } public class WindowsTest2 { public static void main(String[] args) { Window1 window1=new Window1(); Thread w1=new Thread(window1); Thread w2=new Thread(window1); Thread w3=new Thread(window1); w1.setName("窗口1"); w2.setName("窗口2"); w3.setName("窗口3"); w1.start(); w2.start(); w3.start(); } }
2.同步方法解决线程安全问题。
Runnable类:
package com.nsu.edu.cn.thread; class Window1 implements Runnable{ private int ticket=100; @Override public void run() { while (true){ show(); if (ticket==0){ break; } } } public synchronized void show(){ if (ticket > 0) { System.out.println(Thread.currentThread().getName() + ":" + ticket); ticket--; } } } public class WindowsTest2 { public static void main(String[] args) { Window1 window1=new Window1(); Thread w1=new Thread(window1); Thread w2=new Thread(window1); Thread w3=new Thread(window1); w1.setName("窗口1"); w2.setName("窗口2"); w3.setName("窗口3"); w1.start(); w2.start(); w3.start(); } }
继承Thread:
package com.nsu.edu.cn.thread; class Window extends Thread{ private static int ticket=100; @Override public void run() { while (true){ show(); if (ticket <= 0) { break; } } } public static synchronized void show(){ if (ticket > 0) { System.out.println(Thread.currentThread().getName() + ":" + ticket); ticket--; } } } public class WindowTest1 { public static void main(String[] args) { Window w1=new Window(); Window w2=new Window(); Window w3=new Window(); w1.start(); w2.start(); w3.start(); System.out.println(); } }
相关文章推荐
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- Java中创建线程的两个方法____解决火车票或售票问题
- Java 学习笔记16:用ThreadLocal解决多线程安全问题
- java线程创建和使用、线程安全问题及其解决方法
- java解决线程不安全问题的方法
- Java SimpleDateFormat 线程不安全问题及解决方法
- Java线程安全问题及线程安全解决方法
- (47)Java学习笔记——多线程 / 线程的安全问题
- Java笔记3 多线程<1>线程概述、多线程的创建、多线程的安全问题、静态同步函数的锁、死锁
- Java学习笔记45(多线程二:安全问题以及解决原理)
- JAVA学习笔记49——线程概念+进程、线程区别+创建进程三种方法
- 学习笔记之Java线程安全杂谈(中)——Java内存模型、happens-before原则和DCL问题
- Java学习 第二十六章 多线程 / 创建多线程的方式 / 线程常用方法 /线程安全问题 /线程状态 / 多线程包子铺实例
- 我的嵌入式学习笔记(2)--scanf使用常见问题及解决方法
- JAVA学习笔记--多线程(二)线程常用方法
- java线程安全问题笔记
- Java线程同步卖票问题解决方法
- 学习笔记_java.lang.reflect.Field_解决IllegalAccessException异常的方法
- Java学习笔记-问问题?-->静态方法
- JAVA学习笔记(三十七)- 创建继承Thread的线程