javaee学习日记之java基础之多线程
来源:互联网 发布:windows snmp命令 编辑:程序博客网 时间:2024/05/29 04:11
多线程(两种方式实现)
一.继承Thread
class Threa extends Thread { @Override public void run() {//线程方法 ss(); } public static void ss() { for (int x = 0; x < 100; x++) { System.out.println(x); } }}
二.实现Runnable(推荐)
class Th implements Runnable { @Override public void run() {//线程方法 bb(); } public static synchronized void bb() {//同步方法 for (int x = 0; x < 10; x++) { System.out.println(x); } }}
多线程与同步(同步是为了不发生资源混乱的,一种资源保护政策(多线程启动时会抢占资源))
public class Test { public static void main(String[] args) { Threa threa = new Threa(); Threa threa2 = new Threa(); threa.start();//启动线程 threa2.start(); new Thread(new Th()).start();//启动线程 new Thread(new Th()).start(); }}class Threa extends Thread { @Override public void run() { ss();//线程方法 } public static void ss() { for (int x = 0; x < 100; x++) { System.out.println(Thread.currentThread().getName() + ":" + x);//输出线程名和变量 } }}class Th implements Runnable { @Override public void run() { bb(); } public static synchronized void bb() {//同步方法 for (int x = 0; x < 10; x++) { System.out.println(Thread.currentThread().getName() + ":" + x);//输出线程名和变量 } }}
多线程另类实现
import java.util.concurrent.FutureTask;public class Threadw { FutureTask<Integer> ft = new FutureTask<>(() -> { for (int i = 1; i < 101; i++) { System.out.println("one:"+i); } return 1; });//jdk8新特性(函数表达式) FutureTask<Integer> ft2 = new FutureTask<>(() -> { for (int i = 1; i < 101; i++) { System.out.println("two:"+i); } return 1; });//jdk8新特性(函数表达式) public static void main(String[] args) { Threadw threadw = new Threadw(); new Thread(threadw.ft).start();//启动线程 new Thread(threadw.ft2).start(); }}
Thread类的getName方法和getID方法
public class Three extends Thread { @Override public void run() { System.out.println("java"); } public static void main(String[] args) { /* * 3、测试Thread类的getName方法和getID方法, (1)、创建两个线程,输出默认的线程名字和默认的ID。 * (2)、创建一个线程,设置线程的名字并输出线程名字和默认的ID。 */ Three th = new Three(); Three th2 = new Three(); Three th3 = new Three(); System.out.println(th.getId() + " " + th.getName()); System.out.println(th2.getId() + " " + th2.getName()); th3.setName("java");//设置线程的名字 System.out.println(th3.getId() + " " + th3.getName()); }}
守护线程
public class Four extends Thread { public static void main(String[] args) { /* * 4、守护线程 (1)、使用内部类创建线程的方式创建线程d,该线程实现每隔0.1秒输出字符串“后台线程”。 * (2)、设置线程d为守护线程并启动该线程。 (3)、使用main线程阻塞5秒,然后输出字符串“main”线程结束了。 */ try { TestThread tt = new TestThread(); tt.setDaemon(true);//设置线程tt为守护线程 tt.start();//启动该线程 currentThread().sleep(5000);//main线程阻塞5秒 System.out.println("main"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }; }}class TestThread extends Thread{ @Override public void run() { while(true){ try { currentThread().sleep(100);//main线程阻塞0.1秒 System.out.println("后台线程"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
复制文件的线程
class Test1 extends Thread { @Override public void run() { try { File file = new File("eclipse-jee-neon-3-win32-x86_64.zip"); FileInputStream fis = new FileInputStream(file); FileOutputStream fos = new FileOutputStream("eclipse-jee-winx_64.zip"); byte[] b = new byte[1024]; int x = 0; int w = 0; int s = 0; while ((fis.read(b)) != -1) { fos.write(b); w++; if(w==file.length()/1024/100){ s++; System.out.println("正在复制文件:"+s+"%"); w=0; } } System.out.println("复制完成!!!"); System.out.println("文件名称:" + file.getName()); System.out.println("文件大小:" + file.length()+"b"); System.out.println("文件路径:" + file.getAbsolutePath()); System.out.println("最后修改时间:" + file.lastModified()); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}class Test2 extends Thread { @Override public void run() { System.out.println("等待文件复制完毕:"); Test1 test1 = new Test1(); test1.start(); }}
public class Test1{ int c = 0; boolean b = false; public synchronized void terun() {//同步方法 try { this.wait(100);//等待0.1秒 } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } for (int i = 1; i < 53; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); c++; if(c == 2){ try { c = 0; this.notifyAll();//解除所有等待的线程 this.wait();//线程进入等待 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public synchronized void tarun() {//同步方法 try { this.notifyAll();//解除所有等待的线程 this.wait();//线程进入等待 } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } for (char i = 'A'; i <= 'Z'; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); c++; if(c == 1){ c = 0 ; try { this.notifyAll();//解除所有等待的线程 this.wait();//线程进入等待 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }public class One { public static void main(String[] args) { /* * 1、写2个线程,其中一个线程打印1~52,另一个线程打印A~Z,打印顺序应该是12A34B56C...5152Z。 * 提示,需要利用多线程通信知识。并用两种方式实现。 */ Test1 test1 = new Test1(); new Thread(new Onew(test1)).start(); new Thread(new Onea(test1)).start(); }}class Onea implements Runnable { private Test1 test1; Onea(Test1 test1) { this.test1 = test1; } @Override public void run() { test1.terun(); }}class Onew implements Runnable { private Test1 test1; Onew(Test1 test1) { this.test1 = test1; } @Override public void run() { test1.tarun(); }}
线程组
import java.util.concurrent.ExecutorService;import java.util.concurrent.ScheduledThreadPoolExecutor;public class Three {/* 3、使用ExecutorService实现线程池。 (1)、线程池要执行的任务为每隔一秒输出一次当前线程的名字,总计输出10次 (2)、创建一个线程池,该线程池中只有两个空线程 (3)、使线程池执行5次步骤一的任务。*/ public static void main(String[] args) { ExecutorService es = new ScheduledThreadPoolExecutor(1); es.submit(()->{ for(int i=0;i<10;i++){ try { Thread.currentThread(); Thread.sleep(1000); System.out.println(Thread.currentThread().getName()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); ExecutorService es2 = new ScheduledThreadPoolExecutor(2); es2.submit(()->{ for(int i=0;i<10;i++){ try { Thread.currentThread(); Thread.sleep(1000); System.out.println(Thread.currentThread().getName()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); es2.submit(()->{ for(int i=0;i<10;i++){ try { Thread.currentThread(); Thread.sleep(1000); System.out.println(Thread.currentThread().getName()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); es2.submit(()->{ for(int i=0;i<10;i++){ try { Thread.currentThread(); Thread.sleep(1000); System.out.println(Thread.currentThread().getName()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); es2.submit(()->{ for(int i=0;i<10;i++){ try { Thread.currentThread(); Thread.sleep(1000); System.out.println(Thread.currentThread().getName()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); es2.submit(()->{ for(int i=0;i<10;i++){ try { Thread.currentThread(); Thread.sleep(1000); System.out.println(Thread.currentThread().getName()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); }}
阅读全文
0 0
- javaee学习日记之java基础之多线程
- javaee学习日记之java基础之初识java
- javaee学习日记之java基础之集合类
- javaee学习日记之java基础之异常
- javaee学习日记之java基础之I/O流
- javaee学习日记之java基础之网络通讯
- javaee学习日记之java基础之jdbc
- javaee学习日记之java基础之jQuery
- javaee学习日记之java基础之类和对象
- javaee学习日记之java基础之内部类和反射
- 黑马程序员--Java学习日记之多线程
- 学习日记之多线程
- JAVA基础学习之多线程
- Java基础学习之多线程
- java基础学习之多线程
- javaee学习日记之java基础之接口,继承,抽象类
- javaee学习日记之java基础之Sql语句和MySql方言
- Java基础学习记录之多线程
- python-pandas-series
- 一些关于 Iterator 与 多态 与 Collection 与 Iterable 的联系 总结 (Iterator 与 多态 可以解释为什么说 iterator方法中有多态存在)
- 通过file按钮上传的图片如何显示出来 FileReader
- hdu 1181
- C#创建、读写、增加、删除XML操作
- javaee学习日记之java基础之多线程
- (二十四)解释器模式详解
- java 多线程之Exchanger
- 句子的逆序 类似[LintCode]53
- 关于进制转换 二进制与十六进制
- hadoop append 追加文件错误
- Hibernate12_映射关系---manyTomany
- 集成学习(ensemble learning)原理详解
- 设计模式大杂烩(24种设计模式的总结以及学习设计模式的几点建议)