NIIT面试试题总结

Java中实现线程的两种方法

线程总是由操作系统占有和管理,一个新线程的创建和启动只能由操作系统来负责管理。故不能直接调用该线程的run方法,若如此,则不会创建新的线程和启动该线程,而是和其它类对象一样,那么应该怎样正确启动线程呢?调用线程对象的start方法。当调用Thread对象的start方法时,就会调用一个本地的代码,该代码负责是操作系统初始化一个新的线程,并由这个线程类执行Thread对象的run方法。

     创建一个线程有两种方式:其一是继承Thread类并重载run方法;其二是实现Runnable接口。

     第一种方法的代码如下:

import java.util.*;

import java.io.*;

class ThreadTest {

    

    /**

     * Method main

     *

     *

     * @param args

     *

     */

    public static void main(String[] args) {

        // Create three threads

        CustomThread first=new CustomThread("Hopalong ","Cassidy ",200l);

        CustomThread second=new CustomThread("Marilyn ","Monroe ",300l);

        CustomThread third=new CustomThread("Slim ","Pickens ",500l);

        System.out.println("Press Enter when you hava had enought...");

        first.start();

        second.start();

        third.start();

        

        try{

            System.in.read();// Wait until Enter key pressed

            System.out.println("Enter pressed...");

        }

        catch(IOException e){// Handle IO Exception

            System.out.println(e );// Output the exception

        }

        System.out.println("Ending main()...");

        return;

    }   

    // Inner class

    private static class CustomThread extends Thread{

        

        // Constructor

        public CustomThread(String firstName,String secondName,long aWhile){

            this.firstName=firstName;

            this.secondName=secondName;

            this.aWhile=aWhile;

            this.setDaemon(true);

        }

        

        // override run method

        public void run(){

            try{

            

                while(true){

sp;     System.out.println(this.firstName);

this.sleep(aWhile);

System.out.println(this.secondName);

                      

}

}

catch(InterruptedException e){

System.out.println(firstName+secondName+e);

}

}

          

// Constants and Variables

private String firstName;

private String secondName;

private long aWhile;

}

}

        第二种创建线程的方法代码如下:

 

import java.util.*;

import java.io.*;

class ThreadTest1 {

     /**

     * Method main

     * @param args

        */

    public static void main(String[] args) {

        // Create three threads

        Thread first=new Thread(new CustomThread("Hopalong ","Cassidy ",200l));

        Thread second=new Thread(new CustomThread("Marilyn ","Monroe ",300l));

        Thread third=new Thread(new CustomThread("Slim ","Pickens ",500l));

        System.out.println("Press Enter when you hava had enought...");

        first.setDaemon(true);

        second.setDaemon(true);

        third.setDaemon(true);

        first.start();

        second.start();

        third.start();

        

        try{

            System.in.read();// Wait until Enter key pressed

            System.out.println("Enter pressed...");

        }

        catch(IOException e){// Handle IO Exception

            System.out.println(e );// Output the exception

        }

        System.out.println("Ending main()...");

        return;

    }   

    // Inner class

    Private static class CustomThread implements Runnable{

          

// Constructor

public CustomThread(String firstName,String secondName,long aWhile){

this.firstName=firstName;

this.secondName=secondName;

this.aWhile=aWhile;

}

          

// override run method

public void run(){

try{               

while(true){

                      

System.out.println(this.firstName);

Thread.sleep(aWhile);

System.out.println(this.secondName);

                      

}

}

catch(InterruptedException e){

System.out.println(firstName+secondName+e);

}

}           

// Constants and Variables

private String firstName;

private String secondName;

private long aWhile;

}

}

 

什么是事务?四大事务特性是什么?(ACID

事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据修改均被清除。

      举个例子,比如你去银行转帐就是一个事务。转帐可以简单的分为两个步骤,一是把钱从你的帐户中扣除,二是把钱存到你指定转帐的帐户中。这两个步骤就是一个事务,必须全部执行,或是全部不执行。如果从你帐户扣钱成功,但是转帐失败,那么你转帐的钱就没有了;如果是扣钱失败了,但是转帐成功了,那银行就亏了。

       事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务。
      
原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
      
一致性:事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
      
隔离:由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务识别数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是第二个事务修改它之后的状态,事务不会识别中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
      
持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

      SQL Server 以下列事务模式运行。
     
自动提交事务:每条单独的语句都是一个事务。
     
显式事务:每个事务均以 BEGIN TRANSACTION 语句显式开始,以 COMMIT ROLLBACK 语句显式结束。
     
隐式事务:在前一个事务完成时新事务隐式启动,但每个事务仍以 COMMIT ROLLBACK 语句显式完成。
      
批处理级事务:只能应用于多个活动结果集 (MARS),在 MARS 会话中启动的 Transact-SQL 显式或隐式事务变为批处理级事务。当批处理完成时没有提交或回滚的批处理级事务自动由 SQL Server 进行回滚。

       Sql Server中有三种使用事务的方法,分别是Sql语句,SqlTransactionTransactionScope,下面一节将分别介绍这三种事务的使用方法。htt

      事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作

q            这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行

q            事务是一个不可分割的工作逻辑单元

 

转帐过程就是一个事务。

它需要两条UPDATE语句来完成,这两条语句是一个整体,如果其中任一条出现错误,则整个转帐业务也应取消,两个帐户中的余额应恢复到原来的数据,从而确保转帐前和转帐后的余额不变,即都是1001元。

 

 

 

事务的特性

事务必须具备以下四个属性,简称ACID属性:

q原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行

q一致性(Consistency):当事务完成时,数据必须处于一致状态

q隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务

q永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性

 

如何创建事务

q  T-SQL使用下列语句来管理事务:

q      开始事务:BEGIN TRANSACTION

q      提交事务:COMMIT TRANSACTION

q      回滚(撤销)事务:ROLLBACK TRANSACTION

 

一旦事务提交或回滚,则事务结束。

 

q  判断某条语句执行是否出错:

q      使用全局变量@@ERROR

q      @@ERROR只能判断当前一条T-SQL语句执行是否有错,为了判断事务中所有T-SQL语句是否有错,我们需要对错误进行累计;

            如: SET @errorSum=@errorSum+@@error

了解事务的分类:

q  显示事务:用BEGIN TRANSACTION明确指定事务的开始,这是最常用的事务类型

q  隐性事务:通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开,下一个语句自动启动一个新事务。当该事务完成时,再下一个 T-SQL 语句又将启动一个新事务

q  自动提交事务:这是 SQL Server 的默认模式,它将每条单独的 T-SQL 语句视为一个事务,如果成功执行,则自动提交;如果错误,则自动回滚

q  使用事务解决银行转帐问题

……关键语句讲解………

BEGIN TRANSACTION

/*--定义变量,用于累计事务执行过程中的错误--*/

DECLARE @errorSum INT

SET @errorSum=0  --初始化为0,即无错误

/*--转帐:张三的帐户少1000元,李四的帐户多1000*/

UPDATE bank SET currentMoney=currentMoney-1000

   WHERE customerName='张三'

SET @errorSum=@errorSum+@@error

UPDATE bank SET currentMoney=currentMoney+1000

   WHERE customerName='李四'

SET @errorSum=@errorSum+@@error  --累计是否有错误

IF @errorSum<>0  --如果有错误

  BEGIN

    print '交易失败,回滚事务'

    ROLLBACK TRANSACTION

  END 

ELSE

  BEGIN

    print '交易成功,提交事务,写入硬盘,永久的保存'

    COMMIT TRANSACTION  

  END

GO

print '查看转帐事务后的余额'

SELECT * FROM bank 

GO

ASP .NET页面跳转的方法?

一般来说就是三种方法:

1 response.redirect 需要注意的是跳转后内部空间保存的所有数据信息将会丢失,所以需要用到session

  2 server.transfer 这个方法的重定向请求是发生在服务器端,所以浏览器的url地址仍然保留的是原页面的地址!

  3 sever.execute 这个方法主要是用在页面设计上面,而且他必须是跳转同一站点下的页面。

 

数据库方面《正典》:

1. 存储过程和函数的区别
存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。
2.    事务是什么?
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:
原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

3.    游标的作用?如何知道游标已经到了最后?
游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。
4.    触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。
事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。
语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次

5.javaEE里有哪些模式?(共23种)

设计模式:模式是一种问题的解决思路,它已经适用于一个实践环境。并且可以适用于其他环境。

设计模式的分类:分布式编程模式,用户界面模式,数据模型模式三大类。

设计模式的作用:设计的重用; 为设计提供共同的词汇,每个模式名就是一个设计词汇,其概念使得程序员的交流变得方便; 在开发文档中采用模式词汇可以让其他人更容易理解你的想法。

GoF设计模式的分类:

根据目的准则分类:

 1 创建型:creational 与对象的创建有关。

 2 结构型:Structural 处理类或对象之间的组合。

 3 行为型:behavioral 描述类或对象如何交互及如何分配职责。

创建型模式

 

1.抽象工厂模式 AbstractFactory

2.建造者模式 Builder

3.工厂方法模式 Factory Method

4.原型模式 Prototype

5.单例模式 Singleton

 

结构型模式

 

1.适配器模式 Adapter

2.桥接模式 Bridge

3.组合模式 Composite

4.装饰模式 Decorator

5.外观模式 Facade

6.享元模式 Flyweight

7.代理模式 Proxy

 

行为模式

 

1.职责链模式 Chain of Responsibility

2.命令模式 Command

3.解释器模式 Interpreter

4.迭代器模式 Iterator

5.中介者模式 Mediator

6.备忘录模式 Memento

7.观察者模式 Observer

8.状态模式 State

9.策略模式 Strategy

10.模板方法模式 Template Method

11.访问者模式 Visitor

 

工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。 

单例模式:

单例模式适合于一个类只有一个实例的情况,比如窗口管理器,打印缓冲池和文件系统,它们都是原型的例子。典型的情况是,那些对象的类型被遍及一个软件系统的不同对象访问,因此需要一个全局的访问指针,这便是众所周知的单例模式的应用。当然这只有在你确信你不再需要任何多于一个的实例的情况下。
单例模式的用意在于前一段中所关心的。通过单例模式你可以:

确保一个类只有一个实例被建立
提供了一个对对象的全局访问指针
在不影响单例类的客户端的情况下允许将来有多个实例

 

其他看参考资料

 

参考资料: http://junmail.javaeye.com/blog/197741

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值