线程的基础学习之创建线程
来源:互联网 发布:sql字符串中的单引号 编辑:程序博客网 时间:2024/06/04 13:07
线程一般有两种方式实现,一是继承Thread,二是实现Runnable接口。
不用多说,看一个实例代码就清楚了。
public class ThreadTest { public static void main(String[] args) { Thread thread = new Thread(){ @Override public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); System.out.println(this.getName()); } } }; thread.start(); Thread thread2 = new Thread(new Runnable() { @Override public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } } }); thread2.start(); } }
另外,如果既有那个Thread的run()又实现Runnable的run(),会执行哪个run()?
代码:
new Thread(new Runnable() { @Override public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("RUNNABLE:"+Thread.currentThread().getName()); } } }){ public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("THREAD:"+Thread.currentThread().getName()); } }; }.start();
通过,检测先执行Thread的,如果Thread没有run(),就执行Runnable的run();
如何做到线程互斥,也就是线程同步?首先我们回想到synchronized关键字修饰。可以修饰方法,也可以修饰代码块;synchronized相当于一把锁,修饰代码块,要用同一把锁。
代码示例,一个字符一个字符的打印名字:
public class SynchronizedTest { public static void main(String[] args) { new SynchronizedTest().init(); } class Outputer{ /*public synchronized void output(String name){ for (int i = 0; i < name.length(); i++) { System.out.print(name.charAt(i)); } System.out.println(); }*/ /*public void output(String name){ synchronized (this) { for (int i = 0; i < name.length(); i++) { System.out.print(name.charAt(i)); } System.out.println(); } }*/ public void output(String name){ synchronized (SynchronizedTest.class) { for (int i = 0; i < name.length(); i++) { System.out.print(name.charAt(i)); } System.out.println(); } } } private void init() { Outputer outputer = new Outputer(); new Thread(new Runnable() { @Override public void run() { while(true){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } outputer.output("zhangsanfeng"); } } }).start(); new Thread(new Runnable() { @Override public void run() { while(true){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } outputer.output("zhangwuji"); } } }).start(); }}
阅读全文
0 0
- 线程的基础学习之创建线程
- Java多线程基础学习之线程的创建方式总结
- 线程学习之-创建线程
- java基础学习总结——线程之使用Runnable接口创建线程的方法
- 线程之线程的创建
- 【Java并发学习】之线程的创建
- 线程基础—线程的创建
- apue学习之线程创建
- Java基础---线程的创建
- 基础学习总结之线程
- java基础学习之线程
- Java基础学习之线程
- JAVA基础学习之线程
- java多线程API的基础之线程的创建
- Java基础学习----不同种创建线程的区别
- Linux多线程基础学习(二)创建新的线程
- Java基础:多线程之线程创建的两种方式
- Java线程学习-创建线程,线程的简单实用
- kmem_cache_init
- Linux学习-结构体数组和结构体指针
- Spring Boot 自定义favicon.ico
- JAVA中的移位运算
- C语言数据结构将链串里所有值为x的字符删除
- 线程的基础学习之创建线程
- eclipse对Tomcat应用进行远程调试
- JVM规范(五)特定方法
- Power BI 疑难问题辨析
- django -----原生SQL语句查询与前端数据传递
- 消息中间件概述 mq工作原理
- lesson26 用switch语句解决问题
- JVM原理
- SQL中EXISTS的用法