多线程(Java.Thread)学习
线程简介:
1、线程是独立执行的路径
2、程序运行时有很多后台进程 比如主线程、young.gc、full.gc()
3、main是主线程,系统入口,用于执行整个程序
4、一个进程中、如果开辟多个线程,线程的运行由调度器安排调度、调度器的先后顺序不能人为干预
5、对同一份资源操作时,会存在资源抢夺问题,需要加入并发控制
6、线程会带来额外的开销,比如cpu调度时间,并发控制开销
7、每个线程在自己的工作内存交互,内存控制不当会造成数据不一致
线程实现:
Thread
/**
* @Description:TODO
* @Author:Administrator
* @Create 2024/1/12
*/
public class ThreadTest extends Thread{
// 线程入口点
@Override
public void run() {
// 线程体
for (int i = 0;i<10;i++){
System.out.println("我在看蒂法....."+i);
}
}
public static void main(String[] args) {
ThreadTest threadTest = new ThreadTest();
threadTest.start();//开启线程,不一定立即执行 需要cpu调度
threadTest.run();//立即执行线程
for (int i =0;i<10;i++){
System.out.println("我在学Java Thread"+i);
}
}
}
开启 Thread 线程 下载网图,验证start方法线程执行交给cpu。
public class ThreadTest2 extends Thread {
private String url;
private String name;
public ThreadTest2(String url,String name){
this.url = url;
this.name =name;
}
@Override
public void run() {
WebDownloader webDownloader = new WebDownloader();
webDownloader.download(url,name);
System.out.println("下载了文件名为:"+name);
}
public static void main(String[] args) {
ThreadTest2 threadTest1 = new ThreadTest2("https://aistyle.art/assets/files/2023-06-30/1688166112-995353-348703237-145251275241612-1956428239713994473-n.jpg","明日香1.jpg");
ThreadTest2 threadTest2 = new ThreadTest2("https://bkimg.cdn.bcebos.com/pic/8b13632762d0f703918fecd9c0b1463d269759ee6f28?x-bce-process=image/format,f_auto/resize,m_lfit,limit_1,h_300","明日香2.jpg");
ThreadTest2 threadTest3 = new ThreadTest2("https://aistyle.art/assets/files/2023-06-30/1688166112-995353-348703237-145251275241612-1956428239713994473-n.jpg","明日香3.jpg");
threadTest1.start();
threadTest2.start();
threadTest3.start();
}
}
class WebDownloader{
//
public void download(String url,String name){
try{
FileUtils.copyURLToFile(new URL(url),new File(name));
System.out.println("下载完成");
}catch (IOException e){
e.printStackTrace();
}
}
}
实现runable接口
public class TestThread3 implements Runnable {
public static void main(String[] args) {
TestThread3 testThread3 = new TestThread3();
new Thread(testThread3).run();
for (int i = 0; i < 10; i++) {
System.out.println("我在学习" + i);
}
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("我在聊天" + i);
}
}
}
初识并发问题
package org.example.redisson.JavaThread;
/**
* @Description:TODO
* @Author:Administrator
* @Create 2024/1/12
*/
/**
* 创建线程方式2:实现runable 接口重写run
* 执行线程需要啊丢入new Thread(TestThread3)
* 官方推荐 实现runable接口的方式
*/
public class TestThread4 implements Runnable {
// 模拟票数
private int ticketNums = 100;
@Override
public void run() {
while (true){
// 票剩余0时退出
if (ticketNums <= 0){
break;
}
// 模拟延时
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// 对票数加锁
synchronized ((Object)ticketNums){
// 再次判断
if (ticketNums <= 0){
break;
}
System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNums--+"张票");
}
}
}
public static void main(String[] args) {
TestThread4 ticket = new TestThread4();
new Thread(ticket,"陈X华").start();
new Thread(ticket,"席X辉").start();
new Thread(ticket,"李X杰").start();
}
}