javaSE复习总结3

1、线程

Thread类:

  public final String getName():返回该线程的名称

  public final void setName(String name):改变线程名称,使之与参数 name 相同

  getThreadGroup():返回该线程所属的线程组。

线程控制:

  public static void sleep(long millis):线程休眠

  public final void join():线程加入( 等待该线程终止)

  public static void yeild():线程礼让(暂停当前正在执行的线程对象,并执行其他线程。)

  public final void setDaemon(boolean on):后台线程

  public final void stop():  已过时。 该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器

  public void interrupt():   中断线程。

多线程的实现方案:

1)继承Thread类

步骤
 A:自定义类MyThread继承Thread类。
 B:MyThread类里面重写run()
 C:创建对象
 D:启动线程

public class MyThread extends Thread {

public void run() {
for (int x = 0; x < 200; x++) {
System.out.println(x);
}
}

}

public class MyThreadDemo {
public static void main(String[] args) {

  // run():仅仅是封装被线程执行的代码,直接调用是普通方法
  // start():首先启动了线程,然后再由jvm去调用该线程的run()方法。

  // IllegalThreadStateException:非法的线程状态异常

// 创建两个线程对象
  MyThread my1 = new MyThread();
  MyThread my2 = new MyThread();

// 启动线程

  my1.start();
  my2.start();
}
}

2)实现Runnable接口(实现接口可以避免java单继承带来的局限性)

步骤:
 A:自定义类MyRunnable实现Runnable接口
 B:重写run()方法
 C:创建MyRunnable类的对象
 D:创建Thread类的对象,并把C步骤的对象作为构造参数传递

public class MyRunnable implements Runnable {

public void run() {
for (int x = 0; x < 100; x++) {
// 由于实现接口的方式就不能直接使用Thread类的方法了,但是可以间接的使用
System.out.println(Thread.currentThread().getName() + ":" + x);
}
}

}

public class MyRunnableDemo {
public static void main(String[] args) {
// 创建MyRunnable类的对象
  MyRunnable my = new MyRunnable();

// 创建Thread类的对象,并把C步骤的对象作为构造参数传递

// Thread(Runnable target, String name)
  Thread t1 = new Thread(my, "aa");
  Thread t2 = new Thread(my, "bb");

  t1.start();
  t2.start();
}
}

解决线程安全问题:

1)同步代码块:

  synchronized(对象){
  需要同步的代码;
  }

同步可以解决安全问题的根本原因就在那个对象上。该对象如同锁的功能。多个线程必须是同一把锁。

public class SellTicket implements Runnable {
// 定义100张票
  private int tickets = 100;
//创建锁对象
  private Object obj = new Object();

@Override
public void run() {
  while (true) {
  synchronized (obj) {
    if (tickets > 0) {
      try {
        Thread.sleep(100);
      } catch (InterruptedException e) {
        e.printStackTrace();
  }
    System.out.println(Thread.currentThread().getName()+ "正在出售第" + (tickets--) + "张票");
}
}
}
}
}

2)同步方法:把同步加在方法上

  普通方法(同步对象是this)

private synchronized void sellTicket() {

if (tickets > 0) {
   try {
  Thread.sleep(100);
} catch (InterruptedException e) {
     e.printStackTrace();
   }
  System.out.println(Thread.currentThread().getName()+ "正在出售第" + (tickets--) + "张票 ");
   }
}

public void run() {
while (true) {
if(x%2==0){
synchronized (this) {
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "正在出售第" + (tickets--) + "张票 ");
}
}
}else {}

静态方法的锁对象是:类的字节码文件对象

private static synchronized void sellTicket() {
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "正在出售第" + (tickets--) + "张票 ");
}
}
}

public void run() {
while (true) {
if(x%2==0){
synchronized (SellTicket.class) {//这里不可能是this,因为静态中没有this 静态是随着类的加载而加载,首先进内存的是类的字节码文件
if (tickets > 0) {
try {
Thread.sleep(100);

Lock锁

  void lock():获取锁。(如果锁不可用,出于线程调度目的,将禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态。)

  void unlock():释放锁

public class SellTicket implements Runnable {

// 定义票
  private int tickets = 100;

// 定义锁对象
  private Lock lock = new ReentrantLock();

@Override
  public void run() {
  while (true) {
    try {
// 加锁
      lock.lock();
      if (tickets > 0) {
      try {
        Thread.sleep(100);
      } catch (InterruptedException e) {
         e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+ "正在出售第" + (tickets--) + "张票");
  }
} finally {
// 释放锁
  lock.unlock();
}
}
}

}

线程池:(线程池里的每一个线程代码结束后并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用)

  程序启动一个新线程的成本很高,因为涉及到与操作系统的交互,而使用线程池可以很好的提高性能

JDK5新增了Executors工厂类来产生线程池

方法:

  public static ExectorService newCachedThreadPool():开启具有缓存功能的线程池

  public static ExectorService newFixedThreadPool(int nThreads):创建指定数量的线程池

  public static ExectorService  newSingleThreadExector():创建一个

这些方法的返回值是ExectorsService对象,该对象表示一个线程池,可以执行Runnable对象和Callable对象代表的线程

public static void main(String[] args) {
// 创建一个线程池对象,控制要创建几个线程对象。
// public static ExecutorService newFixedThreadPool(int nThreads)
  ExecutorService pool = Executors.newFixedThreadPool(2);

// 可以执行Runnable对象或者Callable对象代表的线程

//Future<?> submit(Runnable task):     提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。
// <T> Future<T> submit(Callable<T> task): 提交一个返回值的任务用于执行,返回一个表示任务的未决结果Future。

  pool.submit(new MyRunnable());
  pool.submit(new MyRunnable());

//结束线程池
  pool.shutdown();//如果不加结束语句,那么线程执行完毕后重新返回池中,以供其他人使用
}

public class MyRunnable implements Runnable {

@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(Thread.currentThread().getName() + ":" + x);
}
}

}

定时器:

Timer:(extends Object)一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。

  Timer()
          创建一个新计时器。

  schedule(TimerTask task, long delay)
          安排在指定延迟后执行指定的任务。

  schedule(TimerTask task, long delay, long period)
          安排指定的任务从指定的延迟后开始进行重复的固定延迟执行

  cancel()
          终止此计时器,丢弃所有当前已安排的任务。

TimerTask(extends Objectimplements Runnable

  TimerTask()
          创建一个新的计时器任务

  run()
          此计时器任务要执行的操作。

  cancel()
          取消此计时器任务。

jvm虚拟机的启动是单线程的还是多线程的?
  多线程的。
   原因是垃圾回收线程也要先启动,否则很容易会出现内存溢出。
     现在的垃圾回收线程加上前面的主线程,最低启动了两个线程,所以,jvm的启动其实是多线程的。

2、设计模式

1)单例设计模式

  饿汉式:

  懒汉式:(延迟加载)

时间: 2024-11-03 22:33:07

javaSE复习总结3的相关文章

JAVASE复习

top 暑假每天中午更新 六花酱赛高 目录: 内部类 枚举类 垃圾回收 修饰符 与运行环境交互 内部类: 1. 外部类可以通过非静态内部类对象访问内部类的private属性,内部类可以直接访问外部类的private属性,说明外部类和内部类都是在“一个类中”,这样才能相互访问到对方的private属性 2. 非静态内部类的实例化:new Outer().new Inner();//这个很好理解,Inner需要用outer对象来实例化,Inner的命名空间是Outer 3. 静态内部类的实例化: n

javaSE复习之&mdash;&mdash;线程

线程其实就是程序执行的一条路径,一个进程中可以包含多条线程,多线程并发执行可以提高程序效率,可以同使完成多项任务 多线程的应用场景 迅雷多线程一起下载 服务器同时处理多个客户请求 多线程原理(单核CPU) 在电脑上运行多个程序时,其实cpu一次只能做一个事,做一段时间后然后换另一个另一个做一段时间,只是cpu的速度太快了,看起来就是同时做很多事,也就是说多线程其实只是表面上的多线程,底层cpu还是一次只能做一个事,但是这有个前提,那就是那个cpu是单核cpu,如果事多核cpu,那么就可以真正的达

JavaSE 复习

这里分享一下学JavaSE 用的教材 高宏静的 <Java从入门到精通>,每一章都是一个单独的PDF用来复习JavaSE该是够了. 链接: http://pan.baidu.com/s/1ntyrDMx 密码: 6htz

个人JAVASE复习笔记

集合 6.28 Arraylist 使用迭代器遍历的时候不能操作  目标 (改变集合元素的个数)除非特有方法,迭代器中提供的方法 其他遍历正在进行时也  尽量不要去操作目标,容易出错 java.util.ConcurrentModificationException (并发修改异常) 中途了解 迭代器 原理以及源码 个人解决  使用了 toArray() 转成 数组操作 (也许以后有更好的方法 期待) 6.29因此 了解到了  并发容器 COW , 6.30还有 线程安全的List list =

JavaSE复习日记 : Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符

// Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符 /* * 一 Java操作符 * * Java操作符都有哪些? * +, -, *, /, %, ++, -- * 这里需要注意 a++ 和 ++a 的区别,后面说; */ /* public class Javase{ public static void main(String[] args){ int a = 10; int b = 20; int c = 30; System.out.println( a

JavaSE复习日记 : java包机制

这里是第一个文件,命名为JavaSE_01.java,我在这个文件里面声明了一个m1()方法,通过包机制,我将在另外一个文件夹里访问这个文件里的东西,确切的说是访问这个文件生成的一个class文件; package com.jaovo.webTeah.db; /* * Java包机制 * * 也就是软件包机制,软件世界中的两大难题:命名和缓存; * * 在程序命名中取一个言简意赅的名字很难,有时候名字取出来发现这个名字已经存在,包括IP,域名,MAC地址冲突等,在计算机中都出现了命名冲突的问题,

JavaSE复习日记 : 条件判断语句

/* 条件控制语句:if(){}else{} 语法: 第一种结构:有不执行的情况 if(boolean表达式){ //第一位真,就执行里面的语句,为假就不执行 java语句; } 第二种结构: if(boolean表达式){ java语句; }else{ java语句; } 第三种结构:多个条件判别式,有不执行情况 if(boolean表达式){ java语句; }else if(boolean表达式){ java语句; }else if(boolean表达式){ java语句; }else i

JavaSE复习总结之集合(Collection)

Java早期版本只给集合类库提供了很少的一组类,但是随着Java版本的升级,Java集合类库越来越充实.集合类库里面存放的,是各式各样的数据容器,我们基本都学过数据结构这门课,数据结构所讲的就是ADT(抽象数据模型)的部分,数据结构不是针对于某一门语言,它所讲的通常是对各语言都通用的ADT部分,ADT和具体实现是没有关系的.但是根据教材.根据各专业的不同,各专业会选用使用不同编程语言实现的教材.而我们所讲的,就是如何使用Java数据容器,即Java集合(用Java实现的ADT),具体的实现部分,

JavaSE复习日记 : 抽象类

/* * 抽象类 * 抽象: * 面向对象的三大核心思想; * 封装: 封装,ppp是封装的一部分 * 继承; * 多态: 父类的引用指向子类的对象 * 引用: 是指一个引用型变量 * 有哪些变量? * 成员变量; * 构造方法的局部变量; * 普通方法的局部变量; * 立马声明立马使用的变量; * 静态变量; * 什么是抽象类? * 就是用abstract关键字修饰的类就叫抽象类; * 什么是抽象方法? * 没有方法体的方法叫抽象方法,连{}都没有;抽象方法必须在修饰符列表中加上abstrac

JavaSE复习日记 : 接口

/* * 接口 * 引用数据类型: * 类,接口,数组; * * 接口是一种引用数据类型,可以看作是一个特殊的类,它存在的目的是为了解决没有多重继承引起的功能弱的问题而设计的,一个类只能有一个父类,但是这个类却可以实现多个接口; * * 接口还可以看作是只有抽象方法的类,即接口的所有方法都必须被实现; * 接口声明的关键字是interface,代替了class;而普通类的继承关键字extends也变成了implements(实现); * 但是其作用和普通类中是一样的,只不过是为了区分而已; *